ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

RISC-V电视主控Hi3731V110:系统架构与整机方案设计实践

RISC-V电视主控Hi3731V110:系统架构与整机方案设计实践 接到Hi3731V110评估板那天我倒没有急着看主频先翻的是指令集一栏。RISC-V三个字母这意味着从工具链、Bootloader、内核到显示驱动整条软件栈都得换个思路重来一遍。这颗芯片在行业里引起关注不是因为性能有多强而是它第一次把RISC-V开放指令集带到电视主控这个量级的产品线上。做电视方案的工程师大概都清楚主控换了指令集软件生态和设计方法基本要跟着换一半。这篇就围绕海思Hi3731V110聊聊这颗RISC-V电视芯片的产品定位、系统架构以及我在这上面跑通一套电视方案的完整设计实践。先说清楚Hi3731V110的完整规格书需要和原厂或代理签NDA才能拿到文章里凡是涉及具体模块的细节我会结合公开的架构信息以及我从Hi3798系列一路做到现在的电视方案设计经验来讲。方向上可以放心细节部分建议大家以自己手里的SDK为准。这篇内容不打算堆参数重点放在三件事上为什么电视主控要转向RISC-V、一颗电视SoC的系统架构是怎么协同设计的、以及从评估板到量产的过程中实际会遇到哪些文档里查不到的坑。1. 电视主控为什么转向RISC-V从成本与生态两条线说起1.1 电视SoC的算力画像CPU从来不是最大开销先看一个容易被忽视的事实电视主控和手机主控的算力需求完全不是一回事。手机这类设备CPU要跑应用、跑游戏、做实时图像处理指令集性能和软件生态直接决定体验上限。但电视这个品类CPU只要管好界面操作、网络连接、内容解析就够了真正的重负载在视频解码、显示合成和画质处理这些固定功能的硬件模块上。我早期在ARM架构的电视方案上调过不少东西一个直观感受是CPU占用率常年不高内存带宽倒是经常见顶。也就是说电视SoC的性能瓶颈从来不是核心数不够而是显存带宽够不够、解码器支不支持对应格式、显示链路口径能不能卡住分辨率。这就是RISC-V能在电视领域落地的前提之一。指令集换成RISC-V不等于性能妥协因为电视场景本就对CPU算力不太敏感。用RISC-V的内核把系统控制、业务逻辑这些活干好把成本和功耗省下来比堆一个高主频ARM核更符合电视产品的真实需求。1.2 从外围芯片到主控RISC-V的量产渗透路线RISC-V在嵌入式领域不是第一次露面这两年WiFi模组、蓝牙芯片、MCU、电源管理芯片里已经大量出现RISC-V内核。但那些都是外围器件即使出了问题对系统整体影响可控。Hi3731V110这种电视主控不一样它承担的是整个系统的中枢角色要在它上面跑操作系统、做显示输出、调度视频解码。这个产品落地本身说明一件事RISC-V的Linux软件栈已经具备产品化能力了。过去说到RISC-V总要加一句生态还不够成熟但Hi3731V110证明了从Bootloader到内核、从显示驱动到多媒体框架已经可以支撑一个完整的电视终端产品。对做方案集成的工程师来说这算是信号——下一波选型RISC-V应该放进候选名单里。1.3 ARM方案与RISC-V方案电视产品上的实际差异拿我在两种架构上的体验做个简单对比方便大家理解差异点对比项ARM电视方案RISC-V电视方案Hi3731V110指令集授权核授权和架构授权费用高开放指令集授权成本有明显优势内核扩展核内特性固定改不了可根据场景裁剪指令集扩展工具链GCC/LLVM支持非常成熟编译器已可用但部分优化仍需手工参数调试手段ARM DS、JTAG资料多习惯者多OpenOCDJTAG配合资料相对少显示驱动DRM/KMS方案成熟框架一致但Vendor适配需要时间沉淀中长期维护依赖原厂SDK更新节奏原厂持续集成中社区资源在快速增长这张表里最值得关注的是最后两行。电视产品生命周期长一款主板可能要卖三五年驱动维护、系统升级、安全补丁都需要跟上。选RISC-V方案时要先确认原厂SDK的维护承诺和版本更新节奏这是采购和研发评审时一个很重要的评估项。2. 拆开Hi3731V110电视SoC的骨架与协作逻辑2.1 CPU子系统跑Linux的RISC-V核心不再只是玩具Hi3731V110的CPU子系统是整颗芯片的控制中枢。基于RISC-V架构的内核带MMU支持跑完整Linux系统。这个支持完整Linux非常关键说明它是认真的应用处理器级别产品不是简单的MCU。在系统里看到的RISC-V内核通常配了独立的L1 Instruction/Data Cache以及共享的L2 Cache。启动流程上芯片内部的BootROM负责从eMMC、SPI NOR等介质加载Bootloader然后启动内核。这颗芯片的中断控制器、定时器、DMA这些基础外设在SDK里都有对应的驱动适配开发体验和ARM时代不会差太远。真正要花时间适应的是编译参数。ARM有armv7-a、armv8-a这些大家熟悉的架构字符串RISC-V这边对应的是机器模式字符串比如rv64imafdc这里面每一个字母都对应一组指令集扩展。如果编译参数和实际内核支持对不上轻则性能下降重则直接Illegal Instruction崩溃。2.2 视频解码与显示链路电视画面的真正主角电视SoC最核心的部分不是CPU而是视频解码和显示输出这条链路。Hi3731V110的定位决定了它会集成支持主流视频格式的解码器处理从网络流、HDMI输入进来的视频信号。我在调试这类芯片时习惯画一条数据流输入的视频流先经过解码器解码出图像帧写入DDR显示控制器再从DDR中读取图形层和视频层的数据经过缩放、色彩管理、混合等处理最终输出到显示面板或者HDMI发送器。这条链路上有个编程时容易忽略的点图层属性。电视界面通常包含一个视频层和多个UI层视频层负责播放画面UI层负责菜单、字幕、台标。图层之间的混合顺序、透明度、颜色空间转换都需要在驱动里提前配置好。框架用DRM/KMS来管理这些图层的话每个图层对应一个plane配置方式很直观。2.3 存储与启动链路大内存带宽才是体验底线电视系统的流畅度很多时候不取决于CPU主频而取决于DDR带宽。我习惯做一个快速估算1080p分辨率下一帧RGBA8888缓冲区的数据量约为1920×1080×4字节换算下来接近8.3MB。按60fps刷新计算仅UI层就需要约500MB/s的带宽再加上视频解码、GPU渲染、CPU读写内存总线上的总负载轻松超过1GB/s。如果是4K分辨率翻四倍带宽压力更大。这也解释了为什么电视芯片的DDR控制器设计和内存训练特别重要。启动时Bootloader里的DDR初始化如果参数不对后续画面会出现随机花屏、进程崩溃甚至系统完全跑不起来。Hi3731V110这一类方案DDR调试是整个bring-up过程中投入时间最长的环节后面我会专门讲这块的排查经验。2.4 为什么说安全启动在电视芯片里越来越重要很多工程师对电视SoC的安全设计不以为意觉得电视而已能有什么攻击面。实际上智能电视已经成了家庭网络里一个常驻在线的节点固件签名校验、安全启动、可信执行环境这些机制该有的都有了。Hi3731V110同样带有安全启动机制BootROM在加载Bootloader阶段会校验固件签名签名不合法就拒绝启动。开发阶段我们通常会在Bootloader里关闭校验或者使用开发签名但量产固件必须开启安全校验。这里提醒一句修改启动参数、刷写非官方固件都需要在设备授权和合规前提下进行正规的固件升级也应当走带签名的升级通道千万不要为了图省事在生产环境里关掉安全校验。3. 从评估板到产品Hi3731V110整机方案的设计顺序3.1 选型的第一个决策点产品形态决定软件栈评估板点亮只是第一步真正做产品选型时第一个决策点不是硬件接口而是软件形态。同样一颗Hi3731V110产品最终是做成一个轻量级的显示终端还是一个完整的智能电视OS平台会直接决定DDR容量、eMMC大小、启动方式甚至影响PCB layout。轻量Linux方案的优势是启动速度快、成本低、系统裁剪自由度高。如果产品只需要播放固定信源内容、展示信息流这个方向很合适。完整智能电视系统方案则在应用生态上有优势可以让用户安装第三方应用交互体验更接近主流智能电视代价是内存和存储需求翻倍启动时间也会变长。这个决策一定要拉上产品经理一起做不能只从技术角度拍板。我在项目里见过不止一次硬件按轻量方案设计了结果产品后期想加应用商店硬件规格不够只能改版周期和成本全搭进去。3.2 硬件参考设计的关键检查清单Hi3731V110的SDK里一般会给出参考原理图强烈建议第一版就照着画不要凭经验改。以下几个点是我每次评审都要盯的电源树与时序电视SoC通常有多路供电各路DCDC/LDO的上电顺序和时序要求都在芯片手册里写得清清楚楚。电源时序错了芯片可能处于不确定状态表现为电流异常、无法启动。参考设计里的时序控制电路一定不要简化。DDR走线DDR部分的等长、阻抗、层叠设计直接决定信号完整性。Hi3731V110这类方案对DDR布线要求不低如果PCB经验不足最好直接复用原厂的参考layout。显示输出接口根据目标屏幕的类型选择LVDS、MiniLVDS还是HDMI输出接口对应的电平、ESD保护和连接器选型提前确认。外设接口USB、UART、I2C、SPI、IR红外接收这些接口按产品需求配置。UART口务必引出这是后面调试最可靠的生命线。3.3 Bring-up检查表一步一步来跳步必踩坑主板做回来之后的bring-up我强烈建议按顺序推进每一步确认无误再进入下一步。我的固定流程是这样的上电前用万用表测量电源网络对地阻抗排除短路。上电后确认各路供电电压正常纹波在允许范围内。用示波器确认系统时钟稳定。检查复位信号确认复位释放时序符合手册要求。连接串口观察BootROM是否输出打印信息确认Bootloader是否加载。验证DDR初始化是否通过这个阶段问题最多后面详说。Bootloader起来后从网络或USB加载内核镜像确认内核启动到文件系统。最后才是显示初始化、触摸/遥控输入、外设逐一验证。这个检查表看起来平平无奇但每一个跳步都可能让问题定位变得极其困难。最典型的例子是Bootloader阶段DDR初始化其实已经失败了但因为串口打印正常很多人误以为DDR没问题结果往后面调了几周回头才发现是内存参数不对。4. RISC-V软件栈在电视方案上的实际适配路径4.1 工具链搭建交叉编译环境与机器模式参数RISC-V平台上搭建交叉编译环境和ARM平台没有本质区别核心是把交叉工具链装好、Sysroot指对、编译参数写正确。电视方案目前普遍使用64位RISC-V交叉编译器的前缀一般是riscv64-linux-gnu-。工具链安装好之后第一个要确认的是机器模式字符串也叫arch字符串。完整的一个示例是rv64imafdcrv64表示64位基础整数指令集i表示基础整数指令m表示整数乘除a表示原子操作f表示单精度浮点d表示双精度浮点c表示压缩指令编译内核和应用程序时这几个扩展参数必须和芯片实际支持的特性以及用户态ABI保持一致。否则最常见的结果是内核起来一半就报Illegal instruction或者应用程序启动即崩溃。如果你用SDK自带的工具链这些参数一般已经配好直接用就行如果是自己搭的环境务必先找到SDK的编译配置说明。交叉编译环境里还有一个容易混淆的地方链接时用的动态库和头文件必须来自目标平台的Sysroot不能用编译机上自带的库。4.2 U-Boot与Linux内核的移植关键点Hi3731V110的SDK通常会提供已经适配好的U-Boot和内核源码理解这些适配点比直接make有用得多。U-Boot这边需要根据具体开发板修改设备树文件确认CONFIG_ARCH_RV64I这类架构相关的配置开启。启动参数里除了常规的consolettyS0,115200还需要在设备树里正确描述内存大小、启动介质类型等硬件信息。U-Boot中DDR初始化和内存训练的部分一般以二进制或独立代码模块的方式提供原厂的初始化代码是最可信的不要自行修改DDR时序参数除非你非常清楚自己在做什么。内核这边RISC-V架构的板级支持本身就包含在内核主线的arch/riscv目录里SOC厂家通常会基于某个主线版本做板级补丁。设备树里CPU节点要正确描述RISC-V属性例如cpu0: cpu0 { compatible riscv; riscv,isa rv64imafdc; riscv,isa-base rv64i; riscv,isa-extensions i, m, a, f, d, c; mmu-type riscv,sv39; device_type cpu; };这组属性描述了CPU指令集、MMU类型等关键信息内核会据此完成后续的调度、内存管理初始化。如果设备树里ISA描述和实际硬件不符最典型的后果是内核执行到某些指令时崩溃而且出错位置非常随机。4.3 显示驱动的DRM/KMS落地别把fbdev思路带进来从ARM平台过来的人这一步特别容易出现适应问题。早年的嵌入式显示驱动是fbdev思路一个/dev/fb0应用层直接往framebuffer里写像素数据。但到了RISC-V电视方案驱动几乎都基于Linux标准的DRM/KMS驱动模型。DRM/KMS的核心概念是plane、crtc、encoder、connector。我第一次在电视SoC上理清这套模型时有个类比plane相当于硬件图层crtc相当于显示控制器encoder负责信号编码connector对应物理输出接口。你要在屏幕上显示视频就是建一个video plane把解码后的buffer挂上去UI层对应primary plane或者overlay plane。设备树里要把这些节点的连接关系描述清楚内核启动日志里可以确认各个模块的绑定情况dmesg | grep -i drm驱动起来后确认/sys/class/drm/目录下能看到对应的card节点。如果HDMI没有输出第一件事不是改驱动而是用i2cdetect之类的工具确认显示器或者测试设备的EDID是否被正确读到。EDID读不到说明I2C通信链路就有问题后面的时序配置无从谈起。4.4 固件打包、签名与量产烧录一条自动化的流水线电视方案的固件通常由多个分区组成Bootloader、内核、设备树、根文件系统、数据分区、可选的恢复分区。每个分区独立镜像最终打包成一个完整的升级文件。量产阶段我最推荐的方式是建立一个自动化打包脚本把编译产物、分区表、签名工具集成到一起。每次构建一键输出最终烧录镜像避免手工拼装造成的遗漏。烧录阶段主流方案支持串口、USB或者网络升级量产线烧录一般会使用原厂提供的量产工具可以同时烧录多台设备。这里要强调一个安全意识量产固件必须开启签名校验。签名机制不仅能防止非官方固件在设备上运行也能在设备返修时提供版本归属的依据。开发调试用的设备可以用开发签名或者关闭校验但正式生产的镜像安全特性一律不允许为了图省事而关闭。5. 实测中踩过的坑RISC-V电视方案的问题排查思路5.1 DDR不稳定表现为花屏、随机崩溃根因往往在时序这块值得多写几句因为在我调试过的所有电视SoC里DDR问题永远是排查耗时最长的。现象可能很随机界面有时花屏、播放视频时偶发卡住、文件系统写入时进程崩溃。这些现象没有一个指向前端应用到最后定位到DDR很多人第一反应是不信。我在这类芯片的调试实践中会在系统起来之后跑内存压力测试覆盖不同读写模式、不同地址区域的随机读写。方法不复杂让内存测试程序持续运行几个小时同时监控系统是否有bit翻转。曾经遇到一次高温环境下随机崩溃常温测试怎么也复现不了后来是在恒温箱里把温度拉到工作温度上限跑了几个小时才靠内存测试工具发现了问题。最终查下来是DDR的ODT终端电阻配置参数方案不合适和主控端不匹配调整参数后问题解决。内存参数的调优没有捷径只能按原厂手册推荐的组合一个一个验证。每个组合至少做一轮常温、一轮高温测试把稳定通过的参数固化为默认值。5.2 冷启动黑屏从串口日志倒推别猜另一个高频问题是黑屏。有一次HDMI输出冷启动黑屏热启动却正常。先说明现象电源管理芯片的上电顺序没问题内核日志也显示DRM驱动加载成功但屏幕就是不亮。顺着串口日志逐步排查最后发现是显示初始化时序里缺少等待HDMI接收端准备好的超时处理导致在某些显示器上初始化过早后续没有重新触发检测。这个环节里最耗时的其实是确认初始化到底走到哪一步的过程。我的建议是不要靠肉眼去看屏幕依赖串口日志和内核里的显示状态节点例如查看connector状态是否变成connected、当前mode是否设置成功。cat /sys/class/drm/card0-HDMI-A-1/status如果状态是disconnected说明物理链路或者DDC通信有问题如果status是connected但无输出再查crtc的enable状态和plane是否提交成功。5.3 RISC-V工具链适配第三方库与浮点ABI的坑第三方库是所有新架构都要过的关卡。从ARM切到RISC-V之后那些不提供源码、只提供ARM或x86预编译so的中间件成了第一批需要替换的对象。项目选型阶段就要把所有关键依赖列一个清单逐一确认是否有RISC-V源码包别等开发到一半才发现某个核心组件没有对应架构的版本。另一个是浮点ABI的问题。RISC-V有软浮点和硬浮点两种ABI编译时对应的工具链选项分别是lp64d和lp64。如果内核和用户态程序使用不同的ABI会出现莫名其妙的运行时错误比如结构体布局对不上、函数传参约定不一致。全系统保持同一个ABI是个硬性要求。5.4 启动时间优化电视产品的第一个体验指标电视产品启动时间直接影响用户的初始体验。RISC-V方案的启动优化方法上和ARM平台是一致的但优化空间比较大因为整体软件栈还没有被充分打磨。我的优化顺序一般是这样先砍掉Bootloader阶段不必要的延时确认串口打印是否开着——高速串口打印在启动阶段其实会占用大量时间量产版本可以关掉或者降速然后看内核裁剪去掉电视系统用不到的驱动和子系统最后是优化根文件系统挂载方式能并行初始化的服务并行化不要串行等。做启动时间分析时最常用的手段是看内核启动日志里的时间戳dmesg每个模块的初始化耗时都在日志里标得清清楚楚按耗时从大到小排序逐一优化。5.5 从这批实践中总结的几条个人判断分享几条我在这类RISC-V电视方案上得到的个人体会。第一评估芯片时不要只看CPU跑分要把显示链路、内存带宽、视频解码能力放在前面。电视产品最终的体验差距几乎都出在这几个模块上。第二RISC-V的软件栈比很多人想象中成熟但也比ARM平台更需要主动维护。这意味着团队里至少要有人持续跟踪社区更新和原厂SDK的迭代不能把代码拿下来就三年不升级。第三调试工具链的选择要尽早确定。OpenOCD加JTAG的办法在RISC-V平台上是通用方案但具体芯片的支持程度需要提前验证。我第一次使用时发现某些调试器的配置文件不完整最后只能手工补目标芯片的描述折腾了不少时间。最后再提醒一句做这类方案千万不要习惯性参考网上的刷机教程和来源不明的镜像。开发调试时用自己的构建产物、在合规授权范围内操作量产线用签名的官方固件才是稳定可靠的做法。RISC-V电视方案的生态还在快速完善早一步上车的人积累的经验就是下一轮产品的竞争力。
返回列表