試:從設(shè)備樹到V4L2鏈路打通)
去年我手里有個項目要用 STM32MP157 做一個輕量級的視覺檢測設(shè)備攝像頭選了 MIPI CSI-2 接口的 OV5640 模組。我原先玩 STM32F4 的 DCMI 并口攝像頭還算順手以為這次頂多是多接幾根差分線、改幾個寄存器的事。真跑起來才知道STM32MP1 這種帶 Cortex-A7 的 MPU攝像頭鏈路完全不是單片機時代的玩法內(nèi)核驅(qū)動、設(shè)備樹、media controller 拓?fù)?、V4L2 參數(shù)任一個環(huán)節(jié)不對畫面就是出不來。折騰了小一個月把整套鏈路摸了個遍。這篇就把 STM32MP1 連接 MIPI CSI-2 攝像頭的關(guān)鍵點、踩過的坑和排查思路寫出來給準(zhǔn)備在這個平臺上做視覺方案的朋友做個參照。這里說的“序列產(chǎn)品”指的是 STM32MP151、STM32MP153、STM32MP157 這一族。命名上大家用得最多的是 MP157帶 GPU 和更豐富的外設(shè)官方評估板也是它。CSI-2 host 這套外設(shè)MP157 上是明確具備的具體到某個子型號要查對應(yīng)數(shù)據(jù)手冊。內(nèi)容里涉及的內(nèi)容基本圍繞 MP157 Linux 主線內(nèi)核 OV5640 模組展開這套組合也是目前資料最全、最不容易卡死的方案。1. STM32MP1 的 CSI-2 接口與 DVP 的本質(zhì)區(qū)別1.1 STM32MP1 的攝像頭外設(shè)全家桶STM32MP1 作為一顆異構(gòu) MPU硬件上集成了 Cortex-A7 和 Cortex-M4。跑 Linux 時A7 負(fù)責(zé)主控制M4 可以用來做實時任務(wù)。攝像頭這條鏈路牽涉到的外設(shè)主要有三個角色CSI-2 host controller接收來自圖像傳感器的 MIPI D-PHY 串行數(shù)據(jù)進(jìn)行協(xié)議解析、字節(jié)拆包、數(shù)據(jù)格式轉(zhuǎn)換最終輸出并行數(shù)據(jù)流。DCMIDigital Camera Memory Interface這是 ST 傳統(tǒng)的數(shù)字?jǐn)z像頭接口可以接收并行數(shù)據(jù)也可以接收從 CSI-2 host 轉(zhuǎn)發(fā)過來的數(shù)據(jù)然后把數(shù)據(jù)寫成 YUV/RGB/Bayer 格式存入內(nèi)存。DMA把 DCMI 輸出的數(shù)據(jù)搬運到 DDR供 CPU 或 GPU 后續(xù)處理。在 Linux 側(cè)的體現(xiàn)就是驅(qū)動目錄drivers/media/platform/st/stm32/下同時存在 DCMI 驅(qū)動和 CSI-2 host 相關(guān)驅(qū)動。硬件上 CSI-2 host 和 DCMI 是級聯(lián)關(guān)系傳感器 - MIPI 差分線 - CSI-2 host - 并行總線 - DCMI - DMA - DDR。這個結(jié)構(gòu)和單片機時代直接拿 GPIO 并口讀傳感器完全不同。以前是傳感器自己輸出 PCLK、VSYNC、HSYNC、D0-D7MCU 靠外部中斷和 DMA 去采樣時序全在傳感器一側(cè)?,F(xiàn)在 MIPI 信號是高速差分串行SoC 端必須有一個專門的 IP 去做解串和協(xié)議解析軟件上更是一套全新的框架。1.2 DVP 并口接口的瓶頸到底在哪不是說要徹底否定 DVP我在很多低分辨率、低幀率的項目里還用它簡單粗暴。但 DVP 的瓶頸是物理性的線多至少 8 根數(shù)據(jù)線加 PCLK、VSYNC、HSYNC奔著 12 根往上走。PCB 走線要等長超過一定頻率串?dāng)_和 EMI 都很難壓。速率上不去并行總線要保證每個 bit 的建立保持時間PCLK 到了幾十 MHz 以后線間 skew 就成了大問題。實際做到 1080p30fps 已經(jīng)很費勁再做高分辨率高幀率更是不現(xiàn)實??垢蓴_差并行線之間的串?dāng)_以及對外輻射在中高速場景下會非常頭疼。這也是為什么現(xiàn)在手機、平板、工業(yè)相機幾乎清一色 MIPI CSI-2。STM32MP157 這種定位的芯片既然要跑 Linux、要做視覺類應(yīng)用就不可能只靠 DVP必須把 CSI-2 host 做進(jìn)去。1.3 CSI-2 到底好在哪里MIPI CSI-2 的優(yōu)勢可以總結(jié)成四句話差分串行時鐘和數(shù)據(jù)都是差分對P/N 兩根線互為參考共模噪聲被大幅抑制。抗干擾能力和信號完整性都比單端并行好太多。線少1 路時鐘 lane 加 12 路數(shù)據(jù) laneSTM32MP1 就是 1 clock lane 2 data lane 的配置總共 6 根線PCB 上走線壓力小得多。速率高官方標(biāo)稱單 lane 最高 1Gbps 級別雙 lane 下 1080p 的 YUV422 在 30fps 內(nèi)是寬裕的。協(xié)議能力CSI-2 協(xié)議里帶了幀開始/幀結(jié)束、行開始/行結(jié)束、ECC 校驗、數(shù)據(jù)類型等機制接收端能比較好地判斷數(shù)據(jù)完整性調(diào)試的時候也容易定位問題。需要強調(diào)的是STM32MP1 的 CSI-2 host 并不是把所有 MIPI 協(xié)議功能全做全了比如它支持的數(shù)據(jù)類型和 lane 數(shù)有限制。我建議拿到板子第一步先把參考手冊里 CSI-2 host 章節(jié)的能力表格過一遍確認(rèn)你的傳感器輸出格式在支持列表里否則后面調(diào)崩了都不知道原因。1.4 接入方式改變帶來的認(rèn)知轉(zhuǎn)變從工程角度這個改變帶來的認(rèn)知沖擊不在于硬件而在于軟件。單片機時代調(diào)攝像頭是讀寄存器、查時序圖、寫中斷服務(wù)函數(shù)。Linux 下完全不是這個路子你要面對的是設(shè)備樹什么地方接了攝像頭、用的是哪個 I2C 控制器、MCLK 從哪來、復(fù)位腳和電源腳在哪全要在 device tree 里描述清楚。V4L2 框架采集視頻走 Video for Linux 2 這套標(biāo)準(zhǔn)框架涉及 media device、video device、subdev 等對象。驅(qū)動分層傳感器驅(qū)動是 subdevCSI-2 host 和 DCMI 各自有驅(qū)動用戶態(tài)看到的可能是一個/dev/video0節(jié)點但背后是一條長長的 pipeline。當(dāng)時我從“單片機思維”切換到“Linux 媒體框架思維”花了不少時間。后來總結(jié)了一句話在 MPU 上接攝像頭先別急著寫代碼先把媒體拓?fù)鋱D畫出來把數(shù)據(jù)流路徑搞明白再動手配置。2. 硬件連接設(shè)計中最容易翻車的幾個細(xì)節(jié)2.1 引腳復(fù)用查表比想當(dāng)然重要STM32MP1 的引腳復(fù)用是 ALTERNATE FUNCTION 機制同一個引腳可以映射多種外設(shè)功能。MIPI CSI-2 不是普通 GPIO它的引腳物理上是固定的差分對這一點和 DVP 可任意分配引腳不一樣。但 CSI-2 host 在芯片內(nèi)部的信號走向以及配套的復(fù)位、時鐘、I2C 引腳依然要做引腳復(fù)用確認(rèn)。我當(dāng)時踩的坑是攝像頭 sensor 的 I2C 我圖省事接到了 I2C4后來發(fā)現(xiàn) I2C4 的引腳和板上另一顆 I2C 設(shè)備的地址沖突只能改接。改完 I2C 引腳又發(fā)現(xiàn)對應(yīng)的i2c4節(jié)點和某個外設(shè)的 pinctrl 沖突。這種問題在 MCU 時代也有但在 MPU 上因為外設(shè)更多、pinctrl 更復(fù)雜更煩。建議的做法是拿到原理圖先做一張引腳占用表把 CSI-2 signal、I2C、MCLK、GPIO 控制腳列全。對照stm32mp157-pinctrl.dtsi里的pinctrl節(jié)點逐個確認(rèn) alternate function。所有功能引腳盡量從 C ortex-A 側(cè)的 Linux 設(shè)備樹來管避免 M4 固件和 Linux 爭搶同一組引腳。2.2 電源和上電時序I2C 讀不到 ID 的第一嫌疑攝像頭傳感器通常需要多路電源以 OV5640 為例常見的是模擬電壓 AVDD2.8V數(shù)字核心電壓 DVDD1.5V有些模組內(nèi)部集成 LDO可以統(tǒng)一供電I/O 電壓 DOVDD1.8V 或 2.8V不同模組要求不一樣但共同點是上電時序不能亂。很多傳感器數(shù)據(jù)手冊里明確規(guī)定 DOVDD 要先于 AVDD 上電或者要求 MCLK 必須在電源穩(wěn)定之后才能給。違反了時序最典型的現(xiàn)象就是 I2C 讀不到 ID或者讀到 ID 但輸出數(shù)據(jù)不對。我在一片自研板上遇到過這樣的情況攝像頭能讀到 ID但輸出全是花屏。查了半天最后發(fā)現(xiàn)是一路電源的紋波偏大MCLK 上也疊加了噪聲。把電源換成低噪聲 LDO、MCLK 串了 22Ω 電阻之后問題消失。電源這一塊不要圖省事直接拿一個 DCDC 輸出懟到 AVDDAVDD 和 PLL 相關(guān)的供電要求通常比較敏感。2.3 差分走線的三個硬指標(biāo)MIPI 差分對的設(shè)計有三個硬指標(biāo)是經(jīng)驗值也基本是通用要求差分阻抗 100Ω走線寬度和間距通過阻抗計算工具算好兩層板幾乎沒戲四層板也要看參考平面是否完整。組內(nèi)等長同一條差分對的 P/N 等長誤差控制在 5mil 以內(nèi)。數(shù)據(jù) lane 之間盡量等長誤差控制在 50mil 以內(nèi)具體要求看數(shù)據(jù)手冊。參考平面完整差分線下方不要被其他層的走線切斷尤其是不要跨分割。STM32MP1 的 MIPI 引腳在 BGA 封裝里引出不少人為了省事把線拉得很遠(yuǎn)或者繞了好幾層過孔。我的建議是HS 信號盡量走表層過孔不超過兩個。如果示波器有差分探頭可以看 D-PHY 的 HS-TX 信號正常應(yīng)該是一個干凈的差分電壓擺幅如果地方出現(xiàn)明顯的回溝或者上升沿爬得慢先查走線和阻抗。2.4 MCLK、I2C、復(fù)位、PWDN 怎么接除了差分信號控制線才是軟件調(diào)試的關(guān)鍵路徑MCLK傳感器需要一個主時鐘常用頻率是 24MHz。STM32MP1 一般通過時鐘樹分配一個 PLL 輸出給攝像頭設(shè)備樹里用clocks屬性描述。I2C作為控制通道給傳感器寫寄存器用。注意 I2C 上拉電阻通常 2.2k~4.7k速率選 400kHz 以內(nèi)比較穩(wěn)。OV5640 在這種應(yīng)用里我用 7-bit 地址 0x3C 的寫法也遇到過要看驅(qū)動里的地址定義。復(fù)位引腳RESETB和 PWDN這兩個 GPIO 必須由 SoC 明確控制不能懸空。上電時先拉低復(fù)位等電源和 MCLK 穩(wěn)定后再釋放復(fù)位。我建議在硬件設(shè)計階段就把這幾個 GPIO 做成可獨立控制的方便調(diào)試時手動拉高拉低。早期調(diào)試階段甚至可以在用戶態(tài)直接導(dǎo)出一個 GPIO 來測別一上來就依賴驅(qū)動里的上電序列。2.5 關(guān)于 ESD 和接插件選型量產(chǎn)產(chǎn)品必須在 MIPI 差分對上做 ESD 保護(hù)常見方案是加低電容 TVS 陣列注意結(jié)電容要小于 0.5pF否則會破壞信號完整性。0.5pF 以上的 TVS 在高速信號上容易導(dǎo)致邊沿劣化。另外接插件選型也有講究。如果是板對板連接器或 FPC 排線盡量選廠商明確標(biāo)稱支持 MIPI D-PHY 速率的產(chǎn)品。我曾經(jīng)在一根軟排線上栽過跟頭攝像頭模組通過 30cm FPC 連接主控FPC 上沒有很好的參考平面1Gbps 速率下完全起不來后來把速率降到 800Mbps 左右才穩(wěn)定。方案驗證階段我建議先直接用官方 DK2 那樣的標(biāo)準(zhǔn)連接器數(shù)據(jù)量鏈路穩(wěn)定后再改 FPC 長度。不要一上來就挑戰(zhàn)極限.3. 內(nèi)核與設(shè)備樹配置讓攝像頭數(shù)據(jù)走進(jìn)內(nèi)存3.1 內(nèi)核 Kconfig 項STM32MP1 跑 Linux攝像頭鏈路需要的內(nèi)核配置主要在Device Drivers - Multimedia support菜單下。和 STM32MP1 相關(guān)的核心選項包括CONFIG_VIDEO_STM32_DCMIDCMI 并口采集驅(qū)動CONFIG_VIDEO_STM32_CSI2HOSTCSI-2 host 驅(qū)動部分內(nèi)核版本命名略有差異CONFIG_MEDIA_CONTROLLER、CONFIG_VIDEO_V4L2_SUBDEV_APImedia controller 和 subdev 支持CONFIG_VIDEO_OV5640OV5640 傳感器驅(qū)動STM32MP1 的官方 SDK 和主線內(nèi)核通常默認(rèn)已經(jīng)把這些模塊編成了模塊或直接編進(jìn)內(nèi)核。我習(xí)慣直接編進(jìn)內(nèi)核省得文件系統(tǒng)里還要管理模塊加載順序。內(nèi)核編譯時建議把CONFIG_VIDEOBUF2_DMA_CONTIG、CONFIG_DMA_CMA也確認(rèn)打開。攝像頭這種大分辨率流媒體需要連續(xù)物理內(nèi)存DMA-CMA 不開buffers 經(jīng)常分配不出來。3.2 設(shè)備樹鏈路設(shè)備樹配置是整個過程中最繞的一環(huán)我第一次配置時對著參考手冊翻了一個下午。理解鏈路不難三個節(jié)點兩對 endpoint。三個節(jié)點分別是攝像頭傳感器節(jié)點掛在某個 I2C 總線上CSI-2 host 節(jié)點DCMI 節(jié)點兩對 endpoint 分別是傳感器節(jié)點內(nèi)的 port 指向 CSI-2 host 的 portCSI-2 host 內(nèi)部的 port 指向 DCMI 的 port實際數(shù)據(jù)流是傳感器把 MIPI 數(shù)據(jù)發(fā)到 CSI-2 hostCSI-2 host 解串后送到 DCMIDCMI 把數(shù)據(jù)寫入內(nèi)存。設(shè)備樹就是把這個“誰連到誰”的拓?fù)涓嬖V內(nèi)核。我當(dāng)時最大的困惑是為什么 sensor 不直接連到 DCMI這是因為傳感器物理上是 MIPI 差分信號DCMI 本身并不認(rèn) MIPI 協(xié)議必須先經(jīng)過 CSI-2 host 解串成并行數(shù)據(jù)DCMI 才能采。這個在理解上特容易繞暈想通了設(shè)備樹就好配了。3.3 一個簡化但可用的設(shè)備樹片段下面是我項目里一個精簡過的設(shè)備樹片段不是完整的板級 dts但結(jié)構(gòu)可以直接參考csi2host { status okay; ports { #address-cells 1; #size-cells 0; port0 { reg 0; csi2host_from_ov5640: endpoint { remote-endpoint ov5640_to_csi2host; clock-lanes 0; >i2cdetect -y -r 4如果能看到3c或者21這個地址說明 sensor 在線。如果地址都沒看到別著急去翻寄存器手冊先查電源、MCLK、復(fù)位腳這三樣是 I2C 枚舉的基礎(chǔ)。4.2 輸出格式、lane 數(shù)與帶寬的取舍OV5640 在 MIPI 模式下可選的輸出格式包括 RAW RGB、YUV422、RGB565 等。對大多數(shù)視覺應(yīng)用來說YUV422 和 RAW10 是最常見的。帶寬估算思路很簡單假設(shè) 1080p1920×108030fpsYUV422每像素 16bit原始數(shù)據(jù)率 1920 × 1080 × 16 × 30 ≈ 995.3 Mbps加上 MIPI 協(xié)議開銷幀頭、行頭、ECC、CRC、填充位實際鏈路速率要留出余量如果跑 2 lane每 lane 大約需要 500Mbps 以上這樣的速率在 STM32MP1 的 CSI-2 host 能力范圍內(nèi)如果輸出 RGB88824bit/像素同樣分辨率下帶寬需求會飆到 1.5Gbps 左右2 lane 就比較緊張了更推薦用 RAW10 或 YUV422。另外lane 數(shù)的選擇不只是速率問題還和驅(qū)動配置、PCB 布線復(fù)雜度有關(guān)。某些成熟的模組默認(rèn)固件只出 1 lane你要改配 lane 數(shù)就得通過 I2C 寫 sensor 寄存器同時把設(shè)備樹的># 先看當(dāng)前媒體拓?fù)?media-ctl -d /dev/media0 -p # 把 sensor 的輸出設(shè)為 1920x1080 YUV422 media-ctl -d /dev/media0 --set-v4l2 ov5640 4-003c:0[fmt:UYVY8_2X8/1920x1080] # 再設(shè)置 DCMI 接收格式 media-ctl -d /dev/media0 --set-v4l2 stm32-dcmi:0[fmt:UYVY8_2X8/1920x1080] # 最后用 v4l2-ctl 拉一幀看看 v4l2-ctl -d /dev/video0 --set-fmt-videowidth1920,height1080,pixelformatYUYV v4l2-ctl -d /dev/video0 --stream-mmap --stream-count1 --stream-to/tmp/frame.yuv如果/tmp/frame.yuv文件拿到 PC 上還是能看到畫面說明鏈路已經(jīng)通了。如果只有黑屏或者滿屏噪聲再去懷疑信號完整性或寄存器配置。4.4 確認(rèn)數(shù)據(jù)流的幾個命令調(diào)試鏈路時我經(jīng)常交錯使用這幾個命令dmesg | grep -i ov5640\|dcmi\|csi看驅(qū)動 probe 是否成功有沒有錯誤。media-ctl -d /dev/media0 -p看媒體拓?fù)浯_認(rèn)每個 pad 的 format。v4l2-ctl -d /dev/video0 --all看當(dāng)前 video node 的格式、輸入、控制項。yavta --list或v4l2-ctl --list-formats-ext看設(shè)備的格式列表確認(rèn)驅(qū)動暴露的格式和傳感器支持的格式是否一致。如果media-ctl -p打印出來的 format 和 sensor 實際輸出不一致一般就是 format 沒有設(shè)置到位或者 subdev 驅(qū)動沒有正確配置寄存器。這個環(huán)節(jié)需要反復(fù)查別怕啰嗦。5. 現(xiàn)場排障記錄攝像頭不出圖的排查鏈路5.1 檢查順序與 dmesg攝像頭不出圖我見過不少人一上來就改設(shè)備樹、調(diào)寄存器折騰半天發(fā)現(xiàn)是排線松了。我的排查順序固定為四步物理連接和供電I2C 枚舉驅(qū)動 probe 日志媒體拓?fù)浜透袷皆O(shè)置在驅(qū)動層面dmesg永遠(yuǎn)是最先要看的dmesg | grep -E csi|dcmi|ov5640|v4l2正常情況下會看到 sensor 驅(qū)動被 probe、DCMI 注冊 video device、CSI-2 host 初始化完成。如果哪一段缺失或報錯問題范圍就縮小了。下面幾種實際碰到的癥狀和排查思路基本覆蓋了大部分情況。5.2 癥狀I(lǐng)2C 讀不到 ID這個癥狀通常和驅(qū)動無關(guān)硬件問題居多。按概率排序分別是供電沒起來或電壓不對。用萬用表量 AVDD、DVDD、DOVDD。MCLK 沒起振或頻率不對。用示波器看傳感器時鐘腳有沒有 24MHz 左右方波。復(fù)位腳沒釋放。默認(rèn)電平不對sensor 一直處于復(fù)位狀態(tài)。I2C 總線地址不對或接線錯了。SDA/SCL 接反或模組實際地址和驅(qū)動配置不一致。我遇到過一次非常隱蔽的問題設(shè)備樹里reset-gpios配錯了 GPIO 編號驅(qū)動 probe 時把復(fù)位腳一直拉低導(dǎo)致 sensor 始終處于復(fù)位態(tài)I2C 枚舉失敗。這類問題通過讀dmesg里 GPIO 分配日志就能發(fā)現(xiàn)。5.3 癥狀I(lǐng)D 能讀到但 v4l2 無數(shù)據(jù)ID 能讀到說明 I2C、供電、時鐘都正常。問題通常出在MIPI lane 配置不一致sensor 側(cè)輸出 2 lane但設(shè)備樹里配成了 1 lane反之亦然。數(shù)據(jù)類型data-type不匹配sensor 輸出 YUV422但 CSI-2 host 或 DCMI 配置成 RAW8。MCLK 頻率不對OV5640 要求 6MHz~54MHz但不合適的頻率會導(dǎo)致 PLL 配置不準(zhǔn)輸出時序異常。media pipeline 沒有正確設(shè)置直接v4l2-ctl --stream-mmap之前沒有先跑media-ctl --set-v4l2把格式鏈路配好。這種情況建議先拉一幀并抓一下dmesgv4l2-ctl -d /dev/video0 --stream-mmap --stream-count5如果提示 buffer timeout說明 sensor 可能有 MIPI 信號輸出但 DCMI 沒有收到有效幀如果提示 no buffer說明鏈路根本沒打通回頭查 media pipeline。5.4 癥狀有流但畫面花屏/黑屏花屏通常不是“沒信號”而是“信號沒對”格式不對用v4l2-ctl --all看當(dāng)前格式如果用 YUYV 采集但 sensor 實際輸出的是 UYVY畫面會偏色或花。把兩邊格式調(diào)成一致就能解決。lane 極性接反MIPI 差分線 P/N 接反。這種情況示波器看信號也有波形但數(shù)據(jù)解析完全不對。時鐘或數(shù)據(jù) lane 的時序余量不足可以試著降低 lane 速率或者檢查走線等長。CMA 內(nèi)存不足導(dǎo)致 buffer 分配異常分辨率越大需要的連續(xù)內(nèi)存越多可以查/proc/buddyinfo或故意調(diào)小分辨率看是否恢復(fù)。花屏問題里格式不匹配是最容易驗證也最容易犯的。我在項目初期用v4l2-ctl --set-fmt-videopixelformatYUYV采集但 sensor 的 media-ctl 格式配成了 UYVY8_2X8結(jié)果畫面顏色完全錯亂。把兩邊的 fourcc 對齊后畫面瞬間正常。5.5 一個檢驗清單排障到最后我習(xí)慣拿一張紙把鏈路畫出來從 sensor → CSI-2 host → DCMI → memory每個環(huán)節(jié)標(biāo)出“驗證手段”和“可能出錯點”。這里整理一個我常用的檢查清單檢查項驗證方式常見問題供電萬用表量電壓AVDD/DVDD 電壓不對、紋波大MCLK示波器 24MHz無時鐘、頻率偏差大I2Ci2cdetect地址不對、SDA/SCL 接反復(fù)位/PWDNGPIO 控制默認(rèn)電平錯誤、時序不滿足Lane 配置media-ctl / dtssensor 與設(shè)備樹 lane 數(shù)不一致數(shù)據(jù)格式v4l2-ctl --allmedia-ctl 與 video 格式不匹配信號完整性示波器差分探頭走線等長、阻抗、ESD 電容過大內(nèi)存分配dmesg / CMA 狀態(tài)連續(xù)內(nèi)存不足buffer 分配失敗在 STM32MP1 上接 MIPI CSI-2 攝像頭硬件選型只是第一關(guān)真正的復(fù)雜度集中在設(shè)備樹、內(nèi)核驅(qū)動和媒體框架的配合上。我個人在實際操作中的體會是先花半天時間把官方板子的鏈路跑通再自研板上做移植是性價比最高的路徑。不要一上來就在裸板上死磕 MIPI 波形那只會讓你陷進(jìn)“信號問題”和“配置問題”互相干擾的泥潭。最后再分享一個心得攝像頭模組別只看價格。OV5640 這類模組水很深同樣標(biāo)著 OV5640有的模組默認(rèn)輸出格式、lane 數(shù)、I2C 地址都不同。和供應(yīng)商確認(rèn)清楚參數(shù)買兩片回來量一量比事后再寫一堆兼容代碼省心得多。