架構(gòu)與整機(jī)方案設(shè)計(jì)實(shí)踐)
接到Hi3731V110評(píng)估板那天我倒沒有急著看主頻先翻的是指令集一欄。RISC-V三個(gè)字母這意味著從工具鏈、Bootloader、內(nèi)核到顯示驅(qū)動(dòng)整條軟件棧都得換個(gè)思路重來一遍。這顆芯片在行業(yè)里引起關(guān)注不是因?yàn)樾阅苡卸鄰?qiáng)而是它第一次把RISC-V開放指令集帶到電視主控這個(gè)量級(jí)的產(chǎn)品線上。做電視方案的工程師大概都清楚主控?fù)Q了指令集軟件生態(tài)和設(shè)計(jì)方法基本要跟著換一半。這篇就圍繞海思Hi3731V110聊聊這顆RISC-V電視芯片的產(chǎn)品定位、系統(tǒng)架構(gòu)以及我在這上面跑通一套電視方案的完整設(shè)計(jì)實(shí)踐。先說清楚Hi3731V110的完整規(guī)格書需要和原廠或代理簽NDA才能拿到文章里凡是涉及具體模塊的細(xì)節(jié)我會(huì)結(jié)合公開的架構(gòu)信息以及我從Hi3798系列一路做到現(xiàn)在的電視方案設(shè)計(jì)經(jīng)驗(yàn)來講。方向上可以放心細(xì)節(jié)部分建議大家以自己手里的SDK為準(zhǔn)。這篇內(nèi)容不打算堆參數(shù)重點(diǎn)放在三件事上為什么電視主控要轉(zhuǎn)向RISC-V、一顆電視SoC的系統(tǒng)架構(gòu)是怎么協(xié)同設(shè)計(jì)的、以及從評(píng)估板到量產(chǎn)的過程中實(shí)際會(huì)遇到哪些文檔里查不到的坑。1. 電視主控為什么轉(zhuǎn)向RISC-V從成本與生態(tài)兩條線說起1.1 電視SoC的算力畫像CPU從來不是最大開銷先看一個(gè)容易被忽視的事實(shí)電視主控和手機(jī)主控的算力需求完全不是一回事。手機(jī)這類設(shè)備CPU要跑應(yīng)用、跑游戲、做實(shí)時(shí)圖像處理指令集性能和軟件生態(tài)直接決定體驗(yàn)上限。但電視這個(gè)品類CPU只要管好界面操作、網(wǎng)絡(luò)連接、內(nèi)容解析就夠了真正的重負(fù)載在視頻解碼、顯示合成和畫質(zhì)處理這些固定功能的硬件模塊上。我早期在ARM架構(gòu)的電視方案上調(diào)過不少東西一個(gè)直觀感受是CPU占用率常年不高內(nèi)存帶寬倒是經(jīng)常見頂。也就是說電視SoC的性能瓶頸從來不是核心數(shù)不夠而是顯存帶寬夠不夠、解碼器支不支持對(duì)應(yīng)格式、顯示鏈路口徑能不能卡住分辨率。這就是RISC-V能在電視領(lǐng)域落地的前提之一。指令集換成RISC-V不等于性能妥協(xié)因?yàn)殡娨晥鼍氨揪蛯?duì)CPU算力不太敏感。用RISC-V的內(nèi)核把系統(tǒng)控制、業(yè)務(wù)邏輯這些活干好把成本和功耗省下來比堆一個(gè)高主頻ARM核更符合電視產(chǎn)品的真實(shí)需求。1.2 從外圍芯片到主控RISC-V的量產(chǎn)滲透路線RISC-V在嵌入式領(lǐng)域不是第一次露面這兩年WiFi模組、藍(lán)牙芯片、MCU、電源管理芯片里已經(jīng)大量出現(xiàn)RISC-V內(nèi)核。但那些都是外圍器件即使出了問題對(duì)系統(tǒng)整體影響可控。Hi3731V110這種電視主控不一樣它承擔(dān)的是整個(gè)系統(tǒng)的中樞角色要在它上面跑操作系統(tǒng)、做顯示輸出、調(diào)度視頻解碼。這個(gè)產(chǎn)品落地本身說明一件事RISC-V的Linux軟件棧已經(jīng)具備產(chǎn)品化能力了。過去說到RISC-V總要加一句生態(tài)還不夠成熟但Hi3731V110證明了從Bootloader到內(nèi)核、從顯示驅(qū)動(dòng)到多媒體框架已經(jīng)可以支撐一個(gè)完整的電視終端產(chǎn)品。對(duì)做方案集成的工程師來說這算是信號(hào)——下一波選型RISC-V應(yīng)該放進(jìn)候選名單里。1.3 ARM方案與RISC-V方案電視產(chǎn)品上的實(shí)際差異拿我在兩種架構(gòu)上的體驗(yàn)做個(gè)簡單對(duì)比方便大家理解差異點(diǎn)對(duì)比項(xiàng)ARM電視方案RISC-V電視方案Hi3731V110指令集授權(quán)核授權(quán)和架構(gòu)授權(quán)費(fèi)用高開放指令集授權(quán)成本有明顯優(yōu)勢內(nèi)核擴(kuò)展核內(nèi)特性固定改不了可根據(jù)場景裁剪指令集擴(kuò)展工具鏈GCC/LLVM支持非常成熟編譯器已可用但部分優(yōu)化仍需手工參數(shù)調(diào)試手段ARM DS、JTAG資料多習(xí)慣者多OpenOCDJTAG配合資料相對(duì)少顯示驅(qū)動(dòng)DRM/KMS方案成熟框架一致但Vendor適配需要時(shí)間沉淀中長期維護(hù)依賴原廠SDK更新節(jié)奏原廠持續(xù)集成中社區(qū)資源在快速增長這張表里最值得關(guān)注的是最后兩行。電視產(chǎn)品生命周期長一款主板可能要賣三五年驅(qū)動(dòng)維護(hù)、系統(tǒng)升級(jí)、安全補(bǔ)丁都需要跟上。選RISC-V方案時(shí)要先確認(rèn)原廠SDK的維護(hù)承諾和版本更新節(jié)奏這是采購和研發(fā)評(píng)審時(shí)一個(gè)很重要的評(píng)估項(xiàng)。2. 拆開Hi3731V110電視SoC的骨架與協(xié)作邏輯2.1 CPU子系統(tǒng)跑Linux的RISC-V核心不再只是玩具Hi3731V110的CPU子系統(tǒng)是整顆芯片的控制中樞?;赗ISC-V架構(gòu)的內(nèi)核帶MMU支持跑完整Linux系統(tǒng)。這個(gè)支持完整Linux非常關(guān)鍵說明它是認(rèn)真的應(yīng)用處理器級(jí)別產(chǎn)品不是簡單的MCU。在系統(tǒng)里看到的RISC-V內(nèi)核通常配了獨(dú)立的L1 Instruction/Data Cache以及共享的L2 Cache。啟動(dòng)流程上芯片內(nèi)部的BootROM負(fù)責(zé)從eMMC、SPI NOR等介質(zhì)加載Bootloader然后啟動(dòng)內(nèi)核。這顆芯片的中斷控制器、定時(shí)器、DMA這些基礎(chǔ)外設(shè)在SDK里都有對(duì)應(yīng)的驅(qū)動(dòng)適配開發(fā)體驗(yàn)和ARM時(shí)代不會(huì)差太遠(yuǎn)。真正要花時(shí)間適應(yīng)的是編譯參數(shù)。ARM有armv7-a、armv8-a這些大家熟悉的架構(gòu)字符串RISC-V這邊對(duì)應(yīng)的是機(jī)器模式字符串比如rv64imafdc這里面每一個(gè)字母都對(duì)應(yīng)一組指令集擴(kuò)展。如果編譯參數(shù)和實(shí)際內(nèi)核支持對(duì)不上輕則性能下降重則直接Illegal Instruction崩潰。2.2 視頻解碼與顯示鏈路電視畫面的真正主角電視SoC最核心的部分不是CPU而是視頻解碼和顯示輸出這條鏈路。Hi3731V110的定位決定了它會(huì)集成支持主流視頻格式的解碼器處理從網(wǎng)絡(luò)流、HDMI輸入進(jìn)來的視頻信號(hào)。我在調(diào)試這類芯片時(shí)習(xí)慣畫一條數(shù)據(jù)流輸入的視頻流先經(jīng)過解碼器解碼出圖像幀寫入DDR顯示控制器再從DDR中讀取圖形層和視頻層的數(shù)據(jù)經(jīng)過縮放、色彩管理、混合等處理最終輸出到顯示面板或者HDMI發(fā)送器。這條鏈路上有個(gè)編程時(shí)容易忽略的點(diǎn)圖層屬性。電視界面通常包含一個(gè)視頻層和多個(gè)UI層視頻層負(fù)責(zé)播放畫面UI層負(fù)責(zé)菜單、字幕、臺(tái)標(biāo)。圖層之間的混合順序、透明度、顏色空間轉(zhuǎn)換都需要在驅(qū)動(dòng)里提前配置好??蚣苡肈RM/KMS來管理這些圖層的話每個(gè)圖層對(duì)應(yīng)一個(gè)plane配置方式很直觀。2.3 存儲(chǔ)與啟動(dòng)鏈路大內(nèi)存帶寬才是體驗(yàn)底線電視系統(tǒng)的流暢度很多時(shí)候不取決于CPU主頻而取決于DDR帶寬。我習(xí)慣做一個(gè)快速估算1080p分辨率下一幀RGBA8888緩沖區(qū)的數(shù)據(jù)量約為1920×1080×4字節(jié)換算下來接近8.3MB。按60fps刷新計(jì)算僅UI層就需要約500MB/s的帶寬再加上視頻解碼、GPU渲染、CPU讀寫內(nèi)存總線上的總負(fù)載輕松超過1GB/s。如果是4K分辨率翻四倍帶寬壓力更大。這也解釋了為什么電視芯片的DDR控制器設(shè)計(jì)和內(nèi)存訓(xùn)練特別重要。啟動(dòng)時(shí)Bootloader里的DDR初始化如果參數(shù)不對(duì)后續(xù)畫面會(huì)出現(xiàn)隨機(jī)花屏、進(jìn)程崩潰甚至系統(tǒng)完全跑不起來。Hi3731V110這一類方案DDR調(diào)試是整個(gè)bring-up過程中投入時(shí)間最長的環(huán)節(jié)后面我會(huì)專門講這塊的排查經(jīng)驗(yàn)。2.4 為什么說安全啟動(dòng)在電視芯片里越來越重要很多工程師對(duì)電視SoC的安全設(shè)計(jì)不以為意覺得電視而已能有什么攻擊面。實(shí)際上智能電視已經(jīng)成了家庭網(wǎng)絡(luò)里一個(gè)常駐在線的節(jié)點(diǎn)固件簽名校驗(yàn)、安全啟動(dòng)、可信執(zhí)行環(huán)境這些機(jī)制該有的都有了。Hi3731V110同樣帶有安全啟動(dòng)機(jī)制BootROM在加載Bootloader階段會(huì)校驗(yàn)固件簽名簽名不合法就拒絕啟動(dòng)。開發(fā)階段我們通常會(huì)在Bootloader里關(guān)閉校驗(yàn)或者使用開發(fā)簽名但量產(chǎn)固件必須開啟安全校驗(yàn)。這里提醒一句修改啟動(dòng)參數(shù)、刷寫非官方固件都需要在設(shè)備授權(quán)和合規(guī)前提下進(jìn)行正規(guī)的固件升級(jí)也應(yīng)當(dāng)走帶簽名的升級(jí)通道千萬不要為了圖省事在生產(chǎn)環(huán)境里關(guān)掉安全校驗(yàn)。3. 從評(píng)估板到產(chǎn)品Hi3731V110整機(jī)方案的設(shè)計(jì)順序3.1 選型的第一個(gè)決策點(diǎn)產(chǎn)品形態(tài)決定軟件棧評(píng)估板點(diǎn)亮只是第一步真正做產(chǎn)品選型時(shí)第一個(gè)決策點(diǎn)不是硬件接口而是軟件形態(tài)。同樣一顆Hi3731V110產(chǎn)品最終是做成一個(gè)輕量級(jí)的顯示終端還是一個(gè)完整的智能電視OS平臺(tái)會(huì)直接決定DDR容量、eMMC大小、啟動(dòng)方式甚至影響PCB layout。輕量Linux方案的優(yōu)勢是啟動(dòng)速度快、成本低、系統(tǒng)裁剪自由度高。如果產(chǎn)品只需要播放固定信源內(nèi)容、展示信息流這個(gè)方向很合適。完整智能電視系統(tǒng)方案則在應(yīng)用生態(tài)上有優(yōu)勢可以讓用戶安裝第三方應(yīng)用交互體驗(yàn)更接近主流智能電視代價(jià)是內(nèi)存和存儲(chǔ)需求翻倍啟動(dòng)時(shí)間也會(huì)變長。這個(gè)決策一定要拉上產(chǎn)品經(jīng)理一起做不能只從技術(shù)角度拍板。我在項(xiàng)目里見過不止一次硬件按輕量方案設(shè)計(jì)了結(jié)果產(chǎn)品后期想加應(yīng)用商店硬件規(guī)格不夠只能改版周期和成本全搭進(jìn)去。3.2 硬件參考設(shè)計(jì)的關(guān)鍵檢查清單Hi3731V110的SDK里一般會(huì)給出參考原理圖強(qiáng)烈建議第一版就照著畫不要憑經(jīng)驗(yàn)改。以下幾個(gè)點(diǎn)是我每次評(píng)審都要盯的電源樹與時(shí)序電視SoC通常有多路供電各路DCDC/LDO的上電順序和時(shí)序要求都在芯片手冊里寫得清清楚楚。電源時(shí)序錯(cuò)了芯片可能處于不確定狀態(tài)表現(xiàn)為電流異常、無法啟動(dòng)。參考設(shè)計(jì)里的時(shí)序控制電路一定不要簡化。DDR走線DDR部分的等長、阻抗、層疊設(shè)計(jì)直接決定信號(hào)完整性。Hi3731V110這類方案對(duì)DDR布線要求不低如果PCB經(jīng)驗(yàn)不足最好直接復(fù)用原廠的參考layout。顯示輸出接口根據(jù)目標(biāo)屏幕的類型選擇LVDS、MiniLVDS還是HDMI輸出接口對(duì)應(yīng)的電平、ESD保護(hù)和連接器選型提前確認(rèn)。外設(shè)接口USB、UART、I2C、SPI、IR紅外接收這些接口按產(chǎn)品需求配置。UART口務(wù)必引出這是后面調(diào)試最可靠的生命線。3.3 Bring-up檢查表一步一步來跳步必踩坑主板做回來之后的bring-up我強(qiáng)烈建議按順序推進(jìn)每一步確認(rèn)無誤再進(jìn)入下一步。我的固定流程是這樣的上電前用萬用表測量電源網(wǎng)絡(luò)對(duì)地阻抗排除短路。上電后確認(rèn)各路供電電壓正常紋波在允許范圍內(nèi)。用示波器確認(rèn)系統(tǒng)時(shí)鐘穩(wěn)定。檢查復(fù)位信號(hào)確認(rèn)復(fù)位釋放時(shí)序符合手冊要求。連接串口觀察BootROM是否輸出打印信息確認(rèn)Bootloader是否加載。驗(yàn)證DDR初始化是否通過這個(gè)階段問題最多后面詳說。Bootloader起來后從網(wǎng)絡(luò)或USB加載內(nèi)核鏡像確認(rèn)內(nèi)核啟動(dòng)到文件系統(tǒng)。最后才是顯示初始化、觸摸/遙控輸入、外設(shè)逐一驗(yàn)證。這個(gè)檢查表看起來平平無奇但每一個(gè)跳步都可能讓問題定位變得極其困難。最典型的例子是Bootloader階段DDR初始化其實(shí)已經(jīng)失敗了但因?yàn)榇诖蛴≌:芏嗳苏`以為DDR沒問題結(jié)果往后面調(diào)了幾周回頭才發(fā)現(xiàn)是內(nèi)存參數(shù)不對(duì)。4. RISC-V軟件棧在電視方案上的實(shí)際適配路徑4.1 工具鏈搭建交叉編譯環(huán)境與機(jī)器模式參數(shù)RISC-V平臺(tái)上搭建交叉編譯環(huán)境和ARM平臺(tái)沒有本質(zhì)區(qū)別核心是把交叉工具鏈裝好、Sysroot指對(duì)、編譯參數(shù)寫正確。電視方案目前普遍使用64位RISC-V交叉編譯器的前綴一般是riscv64-linux-gnu-。工具鏈安裝好之后第一個(gè)要確認(rèn)的是機(jī)器模式字符串也叫arch字符串。完整的一個(gè)示例是rv64imafdcrv64表示64位基礎(chǔ)整數(shù)指令集i表示基礎(chǔ)整數(shù)指令m表示整數(shù)乘除a表示原子操作f表示單精度浮點(diǎn)d表示雙精度浮點(diǎn)c表示壓縮指令編譯內(nèi)核和應(yīng)用程序時(shí)這幾個(gè)擴(kuò)展參數(shù)必須和芯片實(shí)際支持的特性以及用戶態(tài)ABI保持一致。否則最常見的結(jié)果是內(nèi)核起來一半就報(bào)Illegal instruction或者應(yīng)用程序啟動(dòng)即崩潰。如果你用SDK自帶的工具鏈這些參數(shù)一般已經(jīng)配好直接用就行如果是自己搭的環(huán)境務(wù)必先找到SDK的編譯配置說明。交叉編譯環(huán)境里還有一個(gè)容易混淆的地方鏈接時(shí)用的動(dòng)態(tài)庫和頭文件必須來自目標(biāo)平臺(tái)的Sysroot不能用編譯機(jī)上自帶的庫。4.2 U-Boot與Linux內(nèi)核的移植關(guān)鍵點(diǎn)Hi3731V110的SDK通常會(huì)提供已經(jīng)適配好的U-Boot和內(nèi)核源碼理解這些適配點(diǎn)比直接make有用得多。U-Boot這邊需要根據(jù)具體開發(fā)板修改設(shè)備樹文件確認(rèn)CONFIG_ARCH_RV64I這類架構(gòu)相關(guān)的配置開啟。啟動(dòng)參數(shù)里除了常規(guī)的consolettyS0,115200還需要在設(shè)備樹里正確描述內(nèi)存大小、啟動(dòng)介質(zhì)類型等硬件信息。U-Boot中DDR初始化和內(nèi)存訓(xùn)練的部分一般以二進(jìn)制或獨(dú)立代碼模塊的方式提供原廠的初始化代碼是最可信的不要自行修改DDR時(shí)序參數(shù)除非你非常清楚自己在做什么。內(nèi)核這邊RISC-V架構(gòu)的板級(jí)支持本身就包含在內(nèi)核主線的arch/riscv目錄里SOC廠家通常會(huì)基于某個(gè)主線版本做板級(jí)補(bǔ)丁。設(shè)備樹里CPU節(jié)點(diǎn)要正確描述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類型等關(guān)鍵信息內(nèi)核會(huì)據(jù)此完成后續(xù)的調(diào)度、內(nèi)存管理初始化。如果設(shè)備樹里ISA描述和實(shí)際硬件不符最典型的后果是內(nèi)核執(zhí)行到某些指令時(shí)崩潰而且出錯(cuò)位置非常隨機(jī)。4.3 顯示驅(qū)動(dòng)的DRM/KMS落地別把fbdev思路帶進(jìn)來從ARM平臺(tái)過來的人這一步特別容易出現(xiàn)適應(yīng)問題。早年的嵌入式顯示驅(qū)動(dòng)是fbdev思路一個(gè)/dev/fb0應(yīng)用層直接往framebuffer里寫像素?cái)?shù)據(jù)。但到了RISC-V電視方案驅(qū)動(dòng)幾乎都基于Linux標(biāo)準(zhǔn)的DRM/KMS驅(qū)動(dòng)模型。DRM/KMS的核心概念是plane、crtc、encoder、connector。我第一次在電視SoC上理清這套模型時(shí)有個(gè)類比plane相當(dāng)于硬件圖層crtc相當(dāng)于顯示控制器encoder負(fù)責(zé)信號(hào)編碼connector對(duì)應(yīng)物理輸出接口。你要在屏幕上顯示視頻就是建一個(gè)video plane把解碼后的buffer掛上去UI層對(duì)應(yīng)primary plane或者overlay plane。設(shè)備樹里要把這些節(jié)點(diǎn)的連接關(guān)系描述清楚內(nèi)核啟動(dòng)日志里可以確認(rèn)各個(gè)模塊的綁定情況dmesg | grep -i drm驅(qū)動(dòng)起來后確認(rèn)/sys/class/drm/目錄下能看到對(duì)應(yīng)的card節(jié)點(diǎn)。如果HDMI沒有輸出第一件事不是改驅(qū)動(dòng)而是用i2cdetect之類的工具確認(rèn)顯示器或者測試設(shè)備的EDID是否被正確讀到。EDID讀不到說明I2C通信鏈路就有問題后面的時(shí)序配置無從談起。4.4 固件打包、簽名與量產(chǎn)燒錄一條自動(dòng)化的流水線電視方案的固件通常由多個(gè)分區(qū)組成Bootloader、內(nèi)核、設(shè)備樹、根文件系統(tǒng)、數(shù)據(jù)分區(qū)、可選的恢復(fù)分區(qū)。每個(gè)分區(qū)獨(dú)立鏡像最終打包成一個(gè)完整的升級(jí)文件。量產(chǎn)階段我最推薦的方式是建立一個(gè)自動(dòng)化打包腳本把編譯產(chǎn)物、分區(qū)表、簽名工具集成到一起。每次構(gòu)建一鍵輸出最終燒錄鏡像避免手工拼裝造成的遺漏。燒錄階段主流方案支持串口、USB或者網(wǎng)絡(luò)升級(jí)量產(chǎn)線燒錄一般會(huì)使用原廠提供的量產(chǎn)工具可以同時(shí)燒錄多臺(tái)設(shè)備。這里要強(qiáng)調(diào)一個(gè)安全意識(shí)量產(chǎn)固件必須開啟簽名校驗(yàn)。簽名機(jī)制不僅能防止非官方固件在設(shè)備上運(yùn)行也能在設(shè)備返修時(shí)提供版本歸屬的依據(jù)。開發(fā)調(diào)試用的設(shè)備可以用開發(fā)簽名或者關(guān)閉校驗(yàn)但正式生產(chǎn)的鏡像安全特性一律不允許為了圖省事而關(guān)閉。5. 實(shí)測中踩過的坑RISC-V電視方案的問題排查思路5.1 DDR不穩(wěn)定表現(xiàn)為花屏、隨機(jī)崩潰根因往往在時(shí)序這塊值得多寫幾句因?yàn)樵谖艺{(diào)試過的所有電視SoC里DDR問題永遠(yuǎn)是排查耗時(shí)最長的。現(xiàn)象可能很隨機(jī)界面有時(shí)花屏、播放視頻時(shí)偶發(fā)卡住、文件系統(tǒng)寫入時(shí)進(jìn)程崩潰。這些現(xiàn)象沒有一個(gè)指向前端應(yīng)用到最后定位到DDR很多人第一反應(yīng)是不信。我在這類芯片的調(diào)試實(shí)踐中會(huì)在系統(tǒng)起來之后跑內(nèi)存壓力測試覆蓋不同讀寫模式、不同地址區(qū)域的隨機(jī)讀寫。方法不復(fù)雜讓內(nèi)存測試程序持續(xù)運(yùn)行幾個(gè)小時(shí)同時(shí)監(jiān)控系統(tǒng)是否有bit翻轉(zhuǎn)。曾經(jīng)遇到一次高溫環(huán)境下隨機(jī)崩潰常溫測試怎么也復(fù)現(xiàn)不了后來是在恒溫箱里把溫度拉到工作溫度上限跑了幾個(gè)小時(shí)才靠內(nèi)存測試工具發(fā)現(xiàn)了問題。最終查下來是DDR的ODT終端電阻配置參數(shù)方案不合適和主控端不匹配調(diào)整參數(shù)后問題解決。內(nèi)存參數(shù)的調(diào)優(yōu)沒有捷徑只能按原廠手冊推薦的組合一個(gè)一個(gè)驗(yàn)證。每個(gè)組合至少做一輪常溫、一輪高溫測試把穩(wěn)定通過的參數(shù)固化為默認(rèn)值。5.2 冷啟動(dòng)黑屏從串口日志倒推別猜另一個(gè)高頻問題是黑屏。有一次HDMI輸出冷啟動(dòng)黑屏熱啟動(dòng)卻正常。先說明現(xiàn)象電源管理芯片的上電順序沒問題內(nèi)核日志也顯示DRM驅(qū)動(dòng)加載成功但屏幕就是不亮。順著串口日志逐步排查最后發(fā)現(xiàn)是顯示初始化時(shí)序里缺少等待HDMI接收端準(zhǔn)備好的超時(shí)處理導(dǎo)致在某些顯示器上初始化過早后續(xù)沒有重新觸發(fā)檢測。這個(gè)環(huán)節(jié)里最耗時(shí)的其實(shí)是確認(rèn)初始化到底走到哪一步的過程。我的建議是不要靠肉眼去看屏幕依賴串口日志和內(nèi)核里的顯示狀態(tài)節(jié)點(diǎn)例如查看connector狀態(tài)是否變成connected、當(dāng)前mode是否設(shè)置成功。cat /sys/class/drm/card0-HDMI-A-1/status如果狀態(tài)是disconnected說明物理鏈路或者DDC通信有問題如果status是connected但無輸出再查crtc的enable狀態(tài)和plane是否提交成功。5.3 RISC-V工具鏈適配第三方庫與浮點(diǎn)ABI的坑第三方庫是所有新架構(gòu)都要過的關(guān)卡。從ARM切到RISC-V之后那些不提供源碼、只提供ARM或x86預(yù)編譯so的中間件成了第一批需要替換的對(duì)象。項(xiàng)目選型階段就要把所有關(guān)鍵依賴列一個(gè)清單逐一確認(rèn)是否有RISC-V源碼包別等開發(fā)到一半才發(fā)現(xiàn)某個(gè)核心組件沒有對(duì)應(yīng)架構(gòu)的版本。另一個(gè)是浮點(diǎn)ABI的問題。RISC-V有軟浮點(diǎn)和硬浮點(diǎn)兩種ABI編譯時(shí)對(duì)應(yīng)的工具鏈選項(xiàng)分別是lp64d和lp64。如果內(nèi)核和用戶態(tài)程序使用不同的ABI會(huì)出現(xiàn)莫名其妙的運(yùn)行時(shí)錯(cuò)誤比如結(jié)構(gòu)體布局對(duì)不上、函數(shù)傳參約定不一致。全系統(tǒng)保持同一個(gè)ABI是個(gè)硬性要求。5.4 啟動(dòng)時(shí)間優(yōu)化電視產(chǎn)品的第一個(gè)體驗(yàn)指標(biāo)電視產(chǎn)品啟動(dòng)時(shí)間直接影響用戶的初始體驗(yàn)。RISC-V方案的啟動(dòng)優(yōu)化方法上和ARM平臺(tái)是一致的但優(yōu)化空間比較大因?yàn)檎w軟件棧還沒有被充分打磨。我的優(yōu)化順序一般是這樣先砍掉Bootloader階段不必要的延時(shí)確認(rèn)串口打印是否開著——高速串口打印在啟動(dòng)階段其實(shí)會(huì)占用大量時(shí)間量產(chǎn)版本可以關(guān)掉或者降速然后看內(nèi)核裁剪去掉電視系統(tǒng)用不到的驅(qū)動(dòng)和子系統(tǒng)最后是優(yōu)化根文件系統(tǒng)掛載方式能并行初始化的服務(wù)并行化不要串行等。做啟動(dòng)時(shí)間分析時(shí)最常用的手段是看內(nèi)核啟動(dòng)日志里的時(shí)間戳dmesg每個(gè)模塊的初始化耗時(shí)都在日志里標(biāo)得清清楚楚按耗時(shí)從大到小排序逐一優(yōu)化。5.5 從這批實(shí)踐中總結(jié)的幾條個(gè)人判斷分享幾條我在這類RISC-V電視方案上得到的個(gè)人體會(huì)。第一評(píng)估芯片時(shí)不要只看CPU跑分要把顯示鏈路、內(nèi)存帶寬、視頻解碼能力放在前面。電視產(chǎn)品最終的體驗(yàn)差距幾乎都出在這幾個(gè)模塊上。第二RISC-V的軟件棧比很多人想象中成熟但也比ARM平臺(tái)更需要主動(dòng)維護(hù)。這意味著團(tuán)隊(duì)里至少要有人持續(xù)跟蹤社區(qū)更新和原廠SDK的迭代不能把代碼拿下來就三年不升級(jí)。第三調(diào)試工具鏈的選擇要盡早確定。OpenOCD加JTAG的辦法在RISC-V平臺(tái)上是通用方案但具體芯片的支持程度需要提前驗(yàn)證。我第一次使用時(shí)發(fā)現(xiàn)某些調(diào)試器的配置文件不完整最后只能手工補(bǔ)目標(biāo)芯片的描述折騰了不少時(shí)間。最后再提醒一句做這類方案千萬不要習(xí)慣性參考網(wǎng)上的刷機(jī)教程和來源不明的鏡像。開發(fā)調(diào)試時(shí)用自己的構(gòu)建產(chǎn)物、在合規(guī)授權(quán)范圍內(nèi)操作量產(chǎn)線用簽名的官方固件才是穩(wěn)定可靠的做法。RISC-V電視方案的生態(tài)還在快速完善早一步上車的人積累的經(jīng)驗(yàn)就是下一輪產(chǎn)品的競爭力。