動(dòng)移植與調(diào)試實(shí)戰(zhàn)指南)
簡(jiǎn)介面向 Allwinner 平臺(tái) Linux 驅(qū)動(dòng)開(kāi)發(fā)者的 RN6752V1 無(wú)線芯片資料包聚焦芯片數(shù)據(jù)手冊(cè)與驅(qū)動(dòng)源碼的配套解讀。手冊(cè)涵蓋技術(shù)規(guī)格、接口定義、工作模式、電氣特性與參考電路源碼則呈現(xiàn)驅(qū)動(dòng)初始化、I/O 讀寫(xiě)、中斷處理、電源管理及設(shè)備樹(shù)適配等關(guān)鍵實(shí)現(xiàn)適合需要在該平臺(tái)完成 Wi-Fi/藍(lán)牙模塊驅(qū)動(dòng)移植與調(diào)試的開(kāi)發(fā)者。資源為 RAR 壓縮包共 2 個(gè)文件包含 1 份 PDF 數(shù)據(jù)手冊(cè)和 1 個(gè) C 驅(qū)動(dòng)源文件整體大小約 1.55MB文件數(shù)量少但針對(duì)性強(qiáng)便于快速定位核心內(nèi)容。已有 1342 人學(xué)習(xí)瀏覽實(shí)用性得到初步驗(yàn)證。通過(guò)手冊(cè)與源碼對(duì)照讀者可掌握芯片寄存器操作、通信接口配置和 Linux 驅(qū)動(dòng)框架為實(shí)際項(xiàng)目中的無(wú)線模塊接入提供直接參考。 幾個(gè)月前幫一個(gè)做車(chē)載電子方案的朋友調(diào)過(guò)一塊板子主控是瑞芯微的方案外接一路模擬攝像頭需求很簡(jiǎn)單倒車(chē)影像要出圖分辨率不能太糊延時(shí)盡量低。硬件工程師在原理圖上放了顆 RN6752V1結(jié)果軟件這邊一查資料發(fā)現(xiàn)手上的資料就一個(gè)簡(jiǎn)版規(guī)格書(shū)和一份不太完整的參考驅(qū)動(dòng)網(wǎng)上流傳的所謂RN6752V1 datasheet和源碼也大多版本混亂照著移植費(fèi)了不少勁。這篇文章我就把這一路調(diào)通的過(guò)程中關(guān)于這顆芯片 datasheet 的閱讀方法、驅(qū)動(dòng)源碼的獲取與移植、以及實(shí)際調(diào)試中那些不太會(huì)寫(xiě)進(jìn)文檔里的經(jīng)驗(yàn)整理出來(lái)給后面接這顆芯片的人省點(diǎn)時(shí)間。RN6752V1 是一顆模擬視頻解碼芯片輸入 CVBS 信號(hào)輸出 MIPI CSI-2 或 DVP 數(shù)字信號(hào)典型應(yīng)用場(chǎng)景就是嵌入式平臺(tái)接模擬攝像頭。很多 SoC 本身沒(méi)有模擬視頻輸入接口而車(chē)載后裝、安防、工業(yè)視覺(jué)領(lǐng)域又有大量現(xiàn)成的模擬攝像頭這時(shí)候就需要 RN6752V1 這類芯片做翻譯官把模擬信號(hào)轉(zhuǎn)成 SoC 能直接吃的數(shù)字信號(hào)。這篇文章適合正在做相關(guān)方案嵌入式驅(qū)動(dòng)開(kāi)發(fā)、想快速移植這顆芯片驅(qū)動(dòng)的工程師閱讀也適合硬件選型階段需要評(píng)估這顆芯片是否適合自己項(xiàng)目的人參考。1. RN6752V1 到底解決什么問(wèn)題一顆模擬轉(zhuǎn)數(shù)字的橋接芯片先說(shuō)這顆芯片的定位。RN6752V1 屬于模擬前端加視頻解碼器的復(fù)合芯片內(nèi)部集成了 ADC、視頻解碼器、時(shí)序控制器和 MIPI/DVP 發(fā)送器。它的輸入是標(biāo)準(zhǔn)的 CVBS 復(fù)合視頻信號(hào)也就是常說(shuō)的蓮花頭信號(hào)輸出則是 SoC 的 MIPI CSI-2 接口或者并行 DVP 接口。為什么需要這樣一顆芯片原因是現(xiàn)在主流的應(yīng)用處理器尤其是手機(jī)、平板、車(chē)載中控上用的 SoC一代比一代更數(shù)字化優(yōu)先芯片原廠通常在 SoC 上只保留 MIPI CSI、DVP 這類數(shù)字?jǐn)z像頭接口模擬視頻輸入接口基本被砍掉了。但現(xiàn)實(shí)世界里的模擬攝像頭存量非常大一個(gè)項(xiàng)目里可能已經(jīng)布了幾十路模擬攝像頭或者出于成本考慮產(chǎn)品就是想用一顆幾塊錢(qián)的模擬攝像頭模組。這時(shí)候要么換數(shù)字?jǐn)z像頭模組成本高且方案變動(dòng)大要么就加一顆 RN6752V1 這樣的橋接芯片把模擬信號(hào)接進(jìn)來(lái)SoC 什么都不用感知當(dāng)作一顆普通的 MIPI 攝像頭來(lái)用就行。這顆芯片能解決的問(wèn)題我總結(jié)成三點(diǎn)解決模擬攝像頭與數(shù)字 SoC 之間的接口不匹配問(wèn)題相當(dāng)于一個(gè)翻譯官。解決多路模擬輸入信號(hào)切換和后處理的問(wèn)題。解決模擬視頻信號(hào)數(shù)字化過(guò)程中的噪聲處理、自動(dòng)增益、白平衡等模擬域信號(hào)質(zhì)量問(wèn)題。在對(duì)比同類芯片時(shí)RN6752V1 有一個(gè)比較突出的點(diǎn)它直接輸出 MIPI CSI-2而早期很多國(guó)產(chǎn)模擬解碼芯片輸出的是 BT.656 或者 DVP 并行接口需要 SoC 端再接一個(gè)并行轉(zhuǎn) MIPI 的橋接芯片又多一級(jí)硬件、多一層調(diào)試。RN6752V1 一顆芯片就把模擬解碼和 MIPI 發(fā)送做完了BOM 上省一顆料PCB 上省一片面積在這個(gè)價(jià)位段里性價(jià)比很高。從應(yīng)用場(chǎng)景來(lái)看RN6752V1 我很常見(jiàn)于這幾類產(chǎn)品車(chē)載倒車(chē)影像/360 環(huán)視、安防攝像頭、門(mén)禁對(duì)講、醫(yī)療內(nèi)窺鏡、工業(yè)視覺(jué)檢測(cè)。這些場(chǎng)景有一個(gè)共同特點(diǎn)現(xiàn)場(chǎng)要接入的信號(hào)源是模擬的但處理平臺(tái)是嵌入式 SoC 或 Linux 系統(tǒng)。如果只是 MCU 級(jí)別的小系統(tǒng)對(duì)分辨率要求不高那可能用一顆簡(jiǎn)單的 ADC 芯片就夠了。但一旦上了 Linux 系統(tǒng)、要跑 V4L2、要接 ISP 做圖像處理那用 RN6752V1 是最順手的方案因?yàn)?Linux 內(nèi)核的 V4L2 框架對(duì)它支持得相對(duì)成熟出圖路徑非常標(biāo)準(zhǔn)。當(dāng)然這顆芯片也有局限。它的輸入是單路 CVBS單顆芯片只支持一路模擬攝像頭。如果要做四路或者八路的 360 環(huán)視需要同時(shí)用多顆 RN6752V1或者選多通道解碼芯片。這一點(diǎn)在選型時(shí)一定要想清楚別等畫(huà)完板子才發(fā)現(xiàn)一路不夠用。2. datasheet 不能從頭讀到尾先抓這四個(gè)關(guān)鍵板塊拿到一份 RN6752V1 datasheet很多新手容易犯的錯(cuò)就是從頭開(kāi)始讀讀了一堆電氣特性、絕對(duì)最大額定值腦子已經(jīng)暈了真正關(guān)鍵的寄存器配置和時(shí)序參數(shù)反而沒(méi)注意到。我的建議是datasheet 不是教科書(shū)它是一本工具書(shū)你要帶著問(wèn)題去查。做驅(qū)動(dòng)移植你最需要關(guān)心的是四塊內(nèi)容管腳定義、I2C 寄存器映射、輸出接口時(shí)序、初始化流程。2.1 管腳定義先確認(rèn)你的硬件連對(duì)了沒(méi)這塊內(nèi)容雖然看起來(lái)枯燥但排查問(wèn)題的時(shí)候最先要回到這里。RN6752V1 的管腳大致分三組模擬輸入組、數(shù)字輸出組、控制與電源組。模擬輸入組CVBS 信號(hào)輸入腳通常有一個(gè)或者幾個(gè)需要注意輸入阻抗匹配datasheet 上會(huì)給出推薦的輸入電路。數(shù)字輸出組MIPI CSI-2 的差分對(duì)D0P/D0N可能還有 D1P/D1N或者 DVP 的并行數(shù)據(jù)腳。用 MIPI 還是 DVP 取決于你的 SoC 支持什么這個(gè)決定上板之前就要定好。控制與電源組I2C 的 SCL/SDA、復(fù)位腳、電源腳3.3V 和 1.2V 內(nèi)核電壓有些版本還有中斷輸出腳。我遇到過(guò)一個(gè)坑硬件工程師把 MIPI 的 D0P、D0N 接反了圖像出不來(lái)查了半天最后發(fā)現(xiàn)是差分對(duì)接反。這時(shí)候如果你提前看過(guò) datasheet 的管腳定義就能很快定位是硬件問(wèn)題而不是驅(qū)動(dòng)問(wèn)題。2.2 I2C 寄存器映射驅(qū)動(dòng)源碼的靈魂RN6752V1 的寄存器映射是驅(qū)動(dòng)移植的核心所有視頻制式選擇、輸出格式配置、圖像效果調(diào)節(jié)都通過(guò) I2C 寄存器完成。datasheet 里通常會(huì)給一張寄存器表包含寄存器地址、默認(rèn)值、功能描述。看寄存器表的時(shí)候我建議重點(diǎn)抓三類芯片 ID 寄存器讀出來(lái)校驗(yàn) I2C 通信是否正常很多驅(qū)動(dòng)在 probe 階段會(huì)讀這個(gè)寄存器和預(yù)期的 ID 對(duì)比。初始化序列相關(guān)寄存器包括軟件復(fù)位、時(shí)鐘使能、模擬模塊上電、輸出格式選擇等。圖像質(zhì)量控制寄存器包括亮度、對(duì)比度、飽和度、色相調(diào)整這些在后期調(diào)效果時(shí)經(jīng)常要?jiǎng)?。這里有一個(gè)重要的通用經(jīng)驗(yàn)很多視頻解碼芯片的寄存器不止一頁(yè)RN6752V1 這類芯片也常常采用分頁(yè)寄存器機(jī)制。datasheet 里如果出現(xiàn)類似bank select或者page的概念說(shuō)明寄存器是分頁(yè)的操作寄存器之前必須先切換到正確的頁(yè)否則讀寫(xiě)的都是默認(rèn)頁(yè)的地址。在移植源碼的時(shí)候特別要注意有沒(méi)有這個(gè)切換動(dòng)作。2.3 輸出接口時(shí)序告訴 SoC 怎么接數(shù)據(jù)如果用的是 MIPI CSI-2 輸出datasheet 會(huì)給出通道數(shù)、數(shù)據(jù)類型RAW8、RAW10 還是 YUV422、時(shí)鐘范圍、LP/HS 時(shí)序參數(shù)。如果用的是 DVP 輸出會(huì)給 PCLK、HSYNC、VSYNC 的極性以及時(shí)序圖。這一塊決定了你在設(shè)備樹(shù)或者 SoC 端配置 MIPI 時(shí)填什么參數(shù)。比如 SoC 的 D-PHY 配置里有一個(gè)參數(shù)是每 lane 數(shù)據(jù)速率如果你知道 RN6752V1 的輸出時(shí)鐘范圍就能推算大概的速率范圍避免 SoC 端配置和芯片輸出不匹配導(dǎo)致無(wú)圖。2.4 初始化流程別跳過(guò)軟復(fù)位就亂寫(xiě)寄存器datasheet 的應(yīng)用說(shuō)明部分一般會(huì)給一個(gè)簡(jiǎn)化的初始化流程。常見(jiàn)的套路是上電 - 等待電源穩(wěn)定 - 拉復(fù)位 - I2C 寫(xiě)初始化序列 - 檢測(cè)輸入信號(hào) - 正常出圖。很多芯片初始化序列里都包含一個(gè)軟件復(fù)位寄存器這個(gè)寄存器必須在最前面寫(xiě)目的就是讓芯片回到一個(gè)已知的狀態(tài)避免上電時(shí)序不確定導(dǎo)致的寄存器隨機(jī)值。我強(qiáng)烈建議第一次調(diào)板子的時(shí)候嚴(yán)格按照 datasheet 推薦的初始化流程走一遍不要自己亂裁剪。等能正常出圖了再一個(gè)一個(gè)寄存器試哪些可以省、哪些可以改這樣排查問(wèn)題的時(shí)候心里有底。3. 源碼從哪來(lái)原廠 SDK、開(kāi)源倉(cāng)庫(kù)、自己造輪子關(guān)于RN6752V1 源碼這個(gè)話題很多人一上來(lái)就全網(wǎng)搜搜到的卻往往是別的芯片的驅(qū)動(dòng)改的或者版本很老根本編譯不過(guò)。我分享一下我常用的三條路線以及它們的優(yōu)缺點(diǎn)。3.1 原廠 SDK最全但也最封閉RN6752V1 的原廠通常會(huì)提供一份完整的 Linux 驅(qū)動(dòng)源碼和配套的初始化寄存器序列一般通過(guò)代理商或者 FAE 獲取。這份源碼的優(yōu)勢(shì)是寄存器配置經(jīng)過(guò)驗(yàn)證照著用基本能出圖。缺點(diǎn)是提供的代碼往往面向某個(gè)特定平臺(tái)比如只適配瑞芯微或者全志的某幾個(gè) SoC拿過(guò)來(lái)用在別的平臺(tái)上需要改不少地方。我在朋友那個(gè)項(xiàng)目里拿到的原廠參考代碼就是基于瑞芯微的里面的設(shè)備樹(shù)配置、pinctrl 設(shè)置都是按 RK 平臺(tái)的風(fēng)格寫(xiě)的。這類代碼移植到別的平臺(tái)主要改動(dòng)點(diǎn)是設(shè)備樹(shù)中 MIPI D-PHY 的配置、I2C 控制器的引用、以及 V4L2 subdev 注冊(cè)方式。如果你走這條路線記得向 FAE 多要一樣?xùn)|西最新的初始化寄存器序列寄存器數(shù)組。很多時(shí)候 FAE 會(huì)給你一個(gè)新版本初始化代碼比 datasheet 里附帶的更完善能修復(fù)一些出圖偏色或者暗光下噪聲大的問(wèn)題。3.2 GitHub 等開(kāi)源倉(cāng)庫(kù)有參考價(jià)值但別全信在 GitHub 上直接搜rn6752或者rn6752v1有機(jī)會(huì)搜到一些個(gè)人開(kāi)發(fā)者或小團(tuán)隊(duì)上傳的驅(qū)動(dòng)源碼。這些源碼質(zhì)量參差不齊有的能用有的只是一個(gè)大綱。我看過(guò)一份內(nèi)核驅(qū)動(dòng)寫(xiě)得還算規(guī)范probe 函數(shù)、s_stream 回調(diào)、寄存器讀寫(xiě)函數(shù)都齊全但是它的初始化序列很短只有二十幾個(gè)寄存器我燒進(jìn)去之后圖像顏色明顯不對(duì)后來(lái)對(duì)比原廠序列才發(fā)現(xiàn)少了很多模擬前端校準(zhǔn)的寄存器寫(xiě)入。用開(kāi)源源碼的正確姿勢(shì)是把它當(dāng)框架參考而不是可直接使用的成品。也就是說(shuō)用它的驅(qū)動(dòng)結(jié)構(gòu)V4L2 subdev 如何注冊(cè)、i2c_driver 如何寫(xiě)、media controller 的 link 如何建立但寄存器配置部分對(duì)照你的 datasheet 和實(shí)際硬件重新理一遍。3.3 自己寫(xiě)驅(qū)動(dòng)推薦放在 V4L2 subdev 框架里如果你的平臺(tái)沒(méi)有現(xiàn)成驅(qū)動(dòng)那就得自己寫(xiě)。這里我強(qiáng)烈建議把驅(qū)動(dòng)寫(xiě)成標(biāo)準(zhǔn)的 V4L2 subdev 驅(qū)動(dòng)而不是一個(gè)獨(dú)立的字符設(shè)備驅(qū)動(dòng)。原因是你的 SoC 端 ISP 和 video 設(shè)備節(jié)點(diǎn)都是按 V4L2 框架管理的RN6752V1 作為 subdev 掛上去才能和主控的 capture 鏈路正常配合。一個(gè)標(biāo)準(zhǔn)的 RN6752V1 驅(qū)動(dòng)骨架大概包含這幾部分static const struct v4l2_subdev_ops rn6752v1_ops { .core rn6752v1_core_ops, .video rn6752v1_video_ops, }; static int rn6752v1_probe(struct i2c_client *client) { // 分配 subdev 內(nèi)存 // 讀取芯片 ID 校驗(yàn) // 注冊(cè) subdev // 設(shè)置 subdev 的 pad 信息 } static int rn6752v1_s_stream(struct v4l2_subdev *sd, int enable) { if (enable) { // 向芯片寫(xiě)入初始化序列 // 啟動(dòng) MIPI 輸出 } else { // 關(guān)閉輸出進(jìn)入低功耗 } }關(guān)鍵點(diǎn)有三個(gè)probe 階段讀芯片 ID 判斷硬件是否存在避免驅(qū)動(dòng)掛在空 I2C 地址上報(bào)錯(cuò)。s_stream 回調(diào)里做真正的上電出流動(dòng)作因?yàn)閮?nèi)核可能在系統(tǒng)啟動(dòng)時(shí)不立即啟動(dòng)攝像頭流。set_fmt 回調(diào)里正確設(shè)置輸出格式RN6752V1 輸出的一般是 YUV422 格式讓 SoC 端知道自己收到的是什么格式的數(shù)據(jù)。自己寫(xiě)驅(qū)動(dòng)的時(shí)間成本肯定比直接用現(xiàn)成源碼高但好處是你能徹底掌握每個(gè)寄存器配置的含義后續(xù)調(diào)效果也好、換平臺(tái)移植也好都有主動(dòng)權(quán)。4. 調(diào)試實(shí)錄從 I2C 不通到畫(huà)面異常的完整排查鏈路代碼有了、設(shè)備樹(shù)配了上電之后發(fā)現(xiàn)沒(méi)有圖這是最讓人頭疼的階段。下面我把整個(gè)排查鏈路按順序列出來(lái)每一步都有明確的驗(yàn)證方法照著走一遍基本能定位問(wèn)題。4.1 第一步I2C 能不能通這是最基礎(chǔ)的地基驅(qū)動(dòng)加載后第一件事就是通過(guò) I2C 讀芯片 ID。如果 I2C 不通后面什么都是白搭。我那次調(diào)試遇到的現(xiàn)象是驅(qū)動(dòng) probe 時(shí)報(bào)chip ID mismatch讀出來(lái)的寄存器值全是 0xff。排查步驟用 i2cdetect 掃描 I2C 總線看芯片地址有沒(méi)有在列表里。如果掃描到地址說(shuō)明 I2C 物理層沒(méi)問(wèn)題如果掃描不到先查硬件地址引腳有沒(méi)有拉對(duì)、I2C 上拉電阻有沒(méi)有焊、SCL/SDA 有沒(méi)有接反。確認(rèn) I2C 工作速率。有些模擬解碼芯片對(duì) I2C 速率比較敏感400kHz 下工作不穩(wěn)定降到 100kHz 試試??磸?fù)位腳。很多芯片復(fù)位腳是低電平復(fù)位如果硬件把復(fù)位腳拉低了芯片永遠(yuǎn)處于復(fù)位狀態(tài)I2C 自然不通。檢查復(fù)位腳電平是否正確必要時(shí)寫(xiě)一個(gè) GPIO 控制在驅(qū)動(dòng)里主動(dòng)拉高釋放復(fù)位。我那次查到最后就是硬件把復(fù)位腳懸空了芯片在上電后的隨機(jī)狀態(tài)里沒(méi)起來(lái)補(bǔ)焊一個(gè)下拉電阻搞定。4.2 第二步MIPI 有沒(méi)有數(shù)據(jù)輸出I2C 通了、ID 也讀對(duì)了但 SoC 端 v4l2-ctl 直接報(bào)no signal。這時(shí)候的關(guān)鍵是判斷 RN6752V1 有沒(méi)有真的輸出 MIPI 數(shù)據(jù)。在沒(méi)有示波器或者邏輯分析儀的條件下一個(gè)最實(shí)用的方法是看 SoC 端 MIPI D-PHY 的狀態(tài)寄存器。瑞芯微、全志、NXP 的 SoC 都有 MIPI 控制器狀態(tài)寄存器能看到當(dāng)前有沒(méi)有檢測(cè)到 LP 信號(hào)、有沒(méi)有收到 HS 數(shù)據(jù)包。如果狀態(tài)寄存器顯示沒(méi)有收到任何數(shù)據(jù)大概率是芯片沒(méi)有輸出或者 MIPI 配置不對(duì)。重點(diǎn)檢查這幾個(gè)地方MIPI lane 數(shù)量對(duì)不對(duì)。RN6752V1 輸出可能是 1-lane 或 2-lane設(shè)備樹(shù)里配置的 lane 數(shù)必須和硬件實(shí)際連接一致。時(shí)鐘 lane 的 CPLL 配置對(duì)不對(duì)。有些 SoC 的 MIPI 時(shí)鐘只能在一個(gè)范圍內(nèi)工作如果你給 RN6752V1 的外部時(shí)鐘選的頻率太離譜MIPI 數(shù)據(jù)率會(huì)超出 SoC 的接收范圍。設(shè)備樹(shù)里 MIPI 的 data type 配置。RN6752V1 輸出一般是 YUV422 8-bit對(duì)應(yīng)的 MIPI data type 是 0x1E。如果你設(shè)備樹(shù)里配成了 RAW100x2BSoC 端解析就會(huì)完全錯(cuò)亂。4.3 第三步有數(shù)據(jù)但畫(huà)面異常制式和格式的雙重問(wèn)題如果 MIPI 已經(jīng)能收到數(shù)據(jù)但畫(huà)面花屏、偏綠、上下翻轉(zhuǎn)或者只有一半那就是格式和制式配置的問(wèn)題了?;ㄆ炼喟胧?SoC 端設(shè)置的圖像 width/height 和芯片實(shí)際輸出的不一致。PAL 制式下有效的圖像區(qū)域是 720x576NTSC 是 720x480如果兩邊一個(gè)填 720x576 一個(gè)填 720x480畫(huà)面就會(huì)錯(cuò)位花屏。偏色先檢查 RN6752V1 的輸出格式和 SoC 端 media pipeline 期望的格式是否一致。如果芯片輸出 YUV422而 SoC 端按 RGB888 解析顏色一定不對(duì)。另一種情況是初始化序列里自動(dòng)白平衡AWB、自動(dòng)增益控制AGC沒(méi)有開(kāi)啟或者配置參數(shù)不對(duì)這個(gè)需要對(duì)照原廠初始化序列一條一條排查。無(wú)彩色CVBS 解碼之后色度信號(hào)沒(méi)有正常解調(diào)常見(jiàn)原因是輸入 CVBS 信號(hào)制式配置不對(duì)。RN6752V1 有自動(dòng)制式檢測(cè)功能但在某些信號(hào)源上自動(dòng)檢測(cè)不可靠需要手動(dòng)指定 PAL 或 NTSC。畫(huà)面上下翻轉(zhuǎn)或鏡像很多車(chē)載應(yīng)用要求鏡像輸出這個(gè)不是故障是寄存器配置。查 datasheet 里圖像翻轉(zhuǎn)控制位按需求配置即可。4.4 第四步確認(rèn) v4l2 鏈路配置是否正確這一步是 Linux 平臺(tái)特有的坑。即使驅(qū)動(dòng)源碼正確、硬件連接正確如果 media pipeline 的 link 沒(méi)有配置對(duì)SoC 端同樣無(wú)法取流。我建議在調(diào)試階段使用 media-ctl 工具把 pipeline 打出來(lái)看一遍media-ctl -p重點(diǎn)關(guān)注RN6752V1 的 subdev pad 是否和 SoC 的 MIPI CSI 控制器正確連接。sensor subdev 和 ISP/接收端之間的 link 狀態(tài)是否是 ENABLED。sink pad 的格式是否和 source pad 一致。很多時(shí)候系統(tǒng)啟動(dòng)時(shí)內(nèi)核不會(huì)自動(dòng)建立 link需要在應(yīng)用程序或者啟動(dòng)腳本里顯式用 media-ctl 配置。這個(gè)步驟容易被人忽略但其實(shí)是出圖流程里至關(guān)重要的一環(huán)。4.5 用 v4l2-ctl 做最終驗(yàn)證鏈路配置好之后用 v4l2-ctl 抓一幀圖看效果v4l2-ctl --set-fmt-videowidth720,height576,pixelformatYUYV --stream-mmap --stream-count1 --stream-to/tmp/frame.raw直接把抓到的 raw 數(shù)據(jù)丟到 PC 上用 YUV Viewer 看一眼如果圖像正常說(shuō)明鏈路通了。如果還是異?;氐缴厦?4.3 繼續(xù)排查制式和格式配置。5. 容易踩的坑和對(duì)應(yīng)的保命技巧每個(gè)項(xiàng)目都有一些特有的坑RN6752V1 也不例外。下面這幾個(gè)問(wèn)題是我自己實(shí)際遇到過(guò)、或者和同行交流時(shí)他們反復(fù)提到的提前避開(kāi)能省很多時(shí)間。5.1 電源紋波對(duì)模擬信號(hào)的影響超出想象這是我最想提醒的一點(diǎn)。RN6752V1 是模擬視頻解碼芯片內(nèi)部有高精度 ADC對(duì)電源質(zhì)量非常敏感。如果 3.3V 電源上的紋波過(guò)大圖像上會(huì)出現(xiàn)滾動(dòng)的橫條紋或者噪點(diǎn)這種問(wèn)題你調(diào)寄存器怎么調(diào)都調(diào)不掉因?yàn)樗皇羌拇嫫髋渲玫膯?wèn)題是硬件電源設(shè)計(jì)的問(wèn)題。排查的時(shí)候拿示波器量一下芯片電源腳的紋波如果超過(guò) 50mV基本可以斷定是電源問(wèn)題。在芯片電源附近加一顆 10uF 的膽電容和 0.1uF 陶瓷電容通常能明顯改善。如果板子已經(jīng)畫(huà)完電容沒(méi)留位置就把電源走線加粗并且在背面飛線加電容效果也會(huì)好很多。5.2 模擬輸入走線要短、要遠(yuǎn)離數(shù)字信號(hào)CVBS 模擬信號(hào)是從外部進(jìn)來(lái)的非常容易被板上其他數(shù)字信號(hào)干擾。有一次我把 CVBS 走線布在了一條 SPI 時(shí)鐘線旁邊結(jié)果圖像上一片片斜紋。后來(lái)改板把模擬走線遠(yuǎn)離數(shù)字區(qū)域并且加了簡(jiǎn)單的 π 型濾波問(wèn)題才消失。如果是做車(chē)載產(chǎn)品模擬輸入線上還要考慮共模干擾。datasheet 推薦輸入電路里通常會(huì)有扼流圈或者濾波電容不要為了省成本省略不然后期過(guò) EMC 測(cè)試會(huì)更痛苦。5.3 初始化寄存器序列要保存好不同版本差異巨大RN6752V1 原廠經(jīng)常會(huì)在固件版本更新時(shí)修改初始化序列修正一些圖像質(zhì)量問(wèn)題。同一個(gè)芯片用老的初始化序列可能畫(huà)質(zhì)一塌糊涂換新的序列立刻清晰通透。所以拿到最早的初始化序列之后一定要注明來(lái)源和日期同時(shí)向 FAE 確認(rèn)是否有更新的版本。我的做法是把初始化序列做成單獨(dú)的頭文件里面每條寄存器配置都加上注釋說(shuō)明是干什么用的然后記錄版本號(hào)。這樣萬(wàn)一換了序列可以快速 diff 出差異也方便排查是不是某條新增的配置導(dǎo)致的問(wèn)題。5.4 制式檢測(cè)不穩(wěn)定時(shí)手動(dòng)指定比自動(dòng)更好用RN6752V1 有自動(dòng)制式檢測(cè)但實(shí)際使用中如果輸入信號(hào)源質(zhì)量一般自動(dòng)檢測(cè)可能會(huì)在 PAL 和 NTSC 之間反復(fù)跳表現(xiàn)為畫(huà)面偶爾閃爍或者顏色抖動(dòng)。這種情況下與其調(diào)自動(dòng)檢測(cè)的閾值不如直接通過(guò)寄存器強(qiáng)制指定制式反正大多數(shù)產(chǎn)品的輸入信號(hào)制式是固定的。還有一個(gè)經(jīng)驗(yàn)如果項(xiàng)目用的攝像頭信號(hào)源是海外市場(chǎng)來(lái)的先確認(rèn)一下它輸出的到底是 PAL 還是 NTSC因?yàn)閮烧邎?chǎng)頻和行頻不一樣配置錯(cuò)了輕則畫(huà)面滾動(dòng)重則完全同步不上。5.5 備份好你的能出圖配置這是最后一個(gè)建議也是我最常做的操作。當(dāng)系統(tǒng)終于出圖正常了花十幾分鐘用 v4l2-ctl 把當(dāng)前的參數(shù)導(dǎo)出來(lái)保存到工程目錄里。別以為設(shè)備樹(shù)里寫(xiě)的就是最終用的配置很多時(shí)候驅(qū)動(dòng)會(huì)在運(yùn)行時(shí)動(dòng)態(tài)調(diào)一些寄存器這些運(yùn)行時(shí)狀態(tài)和設(shè)備樹(shù)里寫(xiě)的初始值并不完全一致。備份配置的命令v4l2-ctl --all rn6752v1_working_config.txt media-ctl -p rn6752v1_media_pipeline.txt dmesg | grep -i rn6752 rn6752v1_driver_log.txt這三樣?xùn)|西保存好萬(wàn)一哪天固件升級(jí)或者板子改版導(dǎo)致圖像又出了問(wèn)題拿出來(lái)對(duì)比就能快速定位是配置變了還是其他因素導(dǎo)致的。我用 RN6752V1 這顆芯片的時(shí)間和踩過(guò)的坑并不算少但總結(jié)下來(lái)就一句話datasheet 是根源碼是樹(shù)枝調(diào)試經(jīng)驗(yàn)是果實(shí)。把規(guī)格書(shū)讀透把驅(qū)動(dòng)框架搭對(duì)剩下的圖像效果問(wèn)題絕大部分都能通過(guò)寄存器配置解決。希望這篇文章能讓你在接這顆芯片的時(shí)候少走一些彎路。本文還有配套的精品資源點(diǎn)擊獲取