第2章:硬件平台选型:主流SoC方案对比与存储无线选型要点

做机顶盒开发,第一步就是选芯片。

说实话,这一步要是选错了,后面整个团队都得跟着遭罪。我见过不少项目,因为SoC选型时没想清楚,结果到量产阶段发现解码能力不够、或者DDR带宽卡脖子,最后只能硬着头皮换平台,那叫一个痛苦。

今天我就把主流方案掰开揉碎了讲。海思、晶晨、瑞芯微、全志,这四家我全都用过。每个方案的脾气秉性,我多少都摸过一些。

2.1 主流SoC方案对比

先看一张对比表,心里有个底。

厂商 代表型号 CPU架构 视频解码 典型应用 我的评价
海思 Hi3798MV200 四核Cortex-A53 4K@60fps H.265 运营商IPTV、高端OTT 稳定,但生态封闭
晶晨 S905X4 四核Cortex-A55 4K@60fps AV1 海外OTT、Android TV 性价比高,开源友好
瑞芯微 RK3566 四核Cortex-A55 4K@60fps H.265 智能盒子、边缘计算 接口丰富,适合定制
全志 H616 四核Cortex-A53 4K@30fps H.265 低成本入门盒子 便宜,但解码弱

2.1.1 海思:运营商的宠儿

海思的片子,我最早接触是在做电信IPTV项目的时候。说实话,海思的稳定性确实没得挑。它的视频解码流水线是自研的,跑4K@60fps的H.265,画面几乎不掉帧。

但有个问题——SDK封闭。你想改个底层驱动?门都没有。我记得有一次客户要求加一个自定义的HDMI CEC功能,海思那边硬是拖了两个月才给补丁。所以我的建议是:如果你做运营商项目,海思是首选;但如果是做互联网OTT,自由度不够。

重点:海思的DDR控制器对时序要求极高。Layout时一定要严格按照参考设计走线,否则DDR跑不到标称频率。我踩过这个坑,后来改版多花了两周。

2.1.2 晶晨:开源社区的明星

晶晨的S905系列,在海外市场特别火。为什么?因为它的Linux BSP和Android TV支持做得最好。你甚至可以直接从GitHub上拉一份主线内核,稍微改改设备树就能跑起来。

我个人习惯用晶晨做原型验证。它的AV1硬解是亮点,现在很多流媒体平台都在推AV1,未来两三年不会过时。不过要注意,晶晨的PMU(电源管理单元)集成度不高,外部需要搭配一颗专门的PMIC,会增加一点BOM成本。

小技巧:晶晨的启动流程依赖TPL/SPL。如果你遇到启动卡死,先检查DDR初始化参数。我曾经因为DDR频率配置高了50MHz,导致低温下无法启动,排查了整整三天。

2.1.3 瑞芯微:接口最全的“瑞士军刀”

瑞芯微的RK3566,我是在做一款带AI功能的智能盒子时用到的。它的优势在于外设接口——双千兆网口、多路USB3.0、PCIe、甚至SATA。如果你需要接摄像头、硬盘或者做边缘计算,瑞芯微是首选。

但它的视频解码能力比海思和晶晨稍弱。虽然标称支持4K@60fps,但在实际测试中,码率超过80Mbps的H.265流会有轻微掉帧。嗯,这一点你要心里有数。

2.1.4 全志:极致成本的妥协

全志的H616,说白了就是为价格敏感市场准备的。一颗芯片不到5美元,还集成了DDR3控制器和以太网PHY。如果你做的是百元以内的入门盒子,全志是唯一选择。

但代价也很明显:视频解码只支持4K@30fps,而且没有AV1。另外,它的GPU是Mali-G31,跑Android 12的Launcher都偶尔卡顿。我的建议是:别对它抱太高期望,做好基本功就行。

2.2 DDR选型要点

DDR选型,核心就三个字:带宽、容量、时序。

  • 带宽匹配:4K@60fps的H.265解码,大约需要3.2GB/s的内存带宽。DDR3-1600 32bit刚好够用,但建议留20%余量,选DDR4-2400或LPDDR4。
  • 容量规划:Android系统本身占用约1.5GB,加上应用和缓存,2GB是底线。如果做4K UI或跑多任务,建议4GB起步。
  • 时序参数:CL值越低越好。CL11的DDR3比CL13的快约8%。但别为了追求低时序而牺牲稳定性,我见过有人把CL压到9,结果高温测试直接挂掉。
警告:DDR的PCB走线等长要求非常严格。数据线组内误差不要超过±10mil,地址/控制线组间误差不要超过±50mil。否则,轻则降频使用,重则无法启动。

2.3 Flash选型要点

Flash选型,主要看eMMC和NAND Flash两种。

类型 优点 缺点 适用场景
eMMC 内置控制器,坏块管理透明 成本高,容量固定 Android系统、高可靠性产品
NAND Flash 成本低,容量灵活 需要软件做ECC和磨损均衡 Linux系统、低成本方案

我个人习惯:只要预算允许,优先选eMMC。为什么?因为省心。NAND Flash的坏块管理、擦写均衡、ECC纠错,全都要在驱动层实现。我曾经在一个项目里用NAND Flash,结果因为擦写次数没处理好,用了半年就出现文件系统损坏。从那以后,我再也不敢在量产产品里用裸NAND了。

容量方面,Android系统至少需要8GB eMMC,Linux系统4GB就够。但要注意,eMMC的寿命和SLC Cache大小有关。选型时问清楚厂商的TBW(总写入字节数),别只看容量。

2.4 WiFi/BT模组选型要点

WiFi和蓝牙模组,看似简单,其实坑不少。

  • 接口选择:SDIO接口的WiFi吞吐量高,但驱动复杂。USB接口的兼容性好,但会占用一个USB口。我建议优先选SDIO,因为机顶盒对WiFi吞吐量要求高(4K流媒体需要至少50Mbps)。
  • 天线设计:板载天线还是外接天线?板载天线成本低,但信号容易受外壳屏蔽影响。外接天线效果好,但增加装配成本。我的经验是:如果机顶盒是金属外壳,必须用外接天线。
  • 蓝牙共存:WiFi和蓝牙共用2.4G频段,容易互相干扰。选模组时一定要确认它支持PTA(分组流量仲裁)机制。否则,你连蓝牙耳机听歌时,WiFi速度会掉到10Mbps以下。
避坑指南:我曾经选了一款便宜的WiFi模组,结果发现它在5G频段下工作正常,但2.4G频段下只要距离超过5米,信号就断断续续。后来查了规格书才发现,它的2.4G发射功率只有14dBm,而主流方案都在18dBm以上。所以,选型时一定要看发射功率和接收灵敏度这两个参数。

好了,硬件平台选型就聊到这儿。下一章我们开始讲开发环境搭建,包括交叉编译工具链、TFTP/NFS网络启动、以及如何用JTAG调试第一行代码。到时候见。