大家好!在安防監(jiān)控、物聯(lián)網(wǎng)設(shè)備、消費(fèi)電子等領(lǐng)域,瑞芯微(Rockchip)平臺(tái)憑借出色的圖像處理能力,成為很多開(kāi)發(fā)者的首選。但Camera開(kāi)發(fā)涉及硬件鏈路、驅(qū)動(dòng)配置、調(diào)試優(yōu)化等多個(gè)環(huán)節(jié),新手很容易踩坑。今天這篇文章,我們就基于瑞芯微官方《RK VI驅(qū)動(dòng)指南》,梳理RK平臺(tái)Camera開(kāi)發(fā)的核心基礎(chǔ)知識(shí)點(diǎn)和實(shí)戰(zhàn)調(diào)試方法,幫你快速入門(mén),解決常見(jiàn)問(wèn)題。

一、RK Camera開(kāi)發(fā)基礎(chǔ)知識(shí)點(diǎn)
想要做好RK平臺(tái)Camera開(kāi)發(fā),首先要理清“硬件架構(gòu)-軟件配置-關(guān)鍵概念”這三大塊,我們一步步拆解。
1.先搞懂:適用平臺(tái)與核心硬件模塊
RK平臺(tái)對(duì)Camera的支持覆蓋多系列芯片,不同芯片的VI(Video Input)模塊能力有差異,先明確你的開(kāi)發(fā)目標(biāo)平臺(tái):
|
芯片型號(hào)
|
軟件系統(tǒng)
|
核心能力亮點(diǎn)
|
|
RV1126
|
Linux 4.19
|
支持3幀HDR,VICAP Full/Lite雙IP
|
|
RV1109
|
Linux 4.19
|
同RV1126,分辨率上限3072x2048
|
|
RK3566
|
Linux 4.19
|
單VICAP,不支持HDR
|
|
RK3568
|
Linux 4.19
|
支持2幀HDR,分辨率上限4096x2304
|
|
RK3588
|
Linux 5.10
|
雙ISP +雙FEC,支持8K合成+ 7路sensor
|
核心硬件模塊解析
Camera數(shù)據(jù)從傳感器到輸出,要經(jīng)過(guò)“采集-處理-后處理”三大模塊,鏈路如下(建議收藏):
??RKVICAP:視頻采集模塊,負(fù)責(zé)接收Sensor的原始數(shù)據(jù),支持MIPI(DPHY/CPHY)、LVDS、DVP(BT601/BT656/BT1120)接口,不同芯片的VICAP數(shù)量/能力不同(如RV1126有VICAP Full+Lite)。
?RKISP:圖像信號(hào)處理器,Camera的“大腦”,支持HDR合成(2幀/ 3幀)、自動(dòng)白平衡(AWB)、自動(dòng)曝光(AE)、自動(dòng)對(duì)焦(AF)等3A功能,還能處理RAW格式轉(zhuǎn)換。
?CIS(CMOS Image Sensor):相機(jī)傳感器,通過(guò)I2C與主控通信,驅(qū)動(dòng)需基于V4L2 Subdev框架實(shí)現(xiàn),是數(shù)據(jù)的“源頭”。
2.再上手:關(guān)鍵軟件配置
軟件配置的核心是DTS設(shè)備注冊(cè)和驅(qū)動(dòng)框架,這兩步錯(cuò)了,Camera根本跑不起來(lái)。
(1)DTS配置:Camera注冊(cè)的“身份證”
DTS(設(shè)備樹(shù))負(fù)責(zé)描述硬件連接關(guān)系,比如Sensor的接口類型、I2C地址、電源GPIO等,不同接口(MIPI/LVDS/DVP)的配置略有差異,這里以最常用的MIPI接口為例(基于RV1126+OS04A10 Sensor):
// 1. Sensor節(jié)點(diǎn)配置os04a10:os04a10@36{compatible ="ovti,os04a10";// 與驅(qū)動(dòng)匹配的字符串reg = <0x36>;// Sensor I2C地址(7位)clocks = <&cru CLK_MIPICSI_OUT>;// Sensor時(shí)鐘源clock-names ="xvclk";power-domains = <&power RV1126_PD_VI>;// 電源域// 電源配置avdd-supply = <&vcc_avdd>;dovdd-supply = <&vcc_dovdd>;dvdd-supply = <&vcc_dvdd>;// GPIO配置(斷電/復(fù)位)pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;// 模組信息(匹配IQ參數(shù))rockchip,camera-module-index = <1>;// 模組編號(hào)(不重復(fù))rockchip,camera-module-facing ="front";// 朝向(front/back)// MIPI端口鏈接port {ucam_out0: endpoint {remote-endpoint = <&mipi_in_ucam0>;// 鏈接到MIPI DPHYdata-lanes = <1234>;// MIPI Lane數(shù)(必須配置,否則識(shí)別失敗)};};};// 2. MIPI DPHY節(jié)點(diǎn)配置&csi_dphy0 {status ="okay";ports {port@0{mipi_in_ucam0:endpoint@1{reg = <1>;remote-endpoint = <&ucam_out0>;// 反向鏈接Sensordata-lanes = <1234>;// 與Sensor一致};};port@1{csidphy0_out:endpoint@0{remote-endpoint = <&isp_in>;// 鏈接到ISP};};};};// 3. ISP虛擬節(jié)點(diǎn)配置(數(shù)據(jù)鏈路生效)&rkisp_vir0 {status ="okay";ports {port@0{isp_in:endpoint@0{remote-endpoint = <&csidphy0_out>;// 反向鏈接MIPI DPHY};};};};
關(guān)鍵注意點(diǎn):
?compatible必須與Sensor驅(qū)動(dòng)中的of_match_table一致,否則驅(qū)動(dòng)無(wú)法匹配設(shè)備;
?data-lanes必須明確(如4 Lane填<1 2 3 4>),MIPI接口不配置會(huì)識(shí)別為其他類型;
?多Sensor注冊(cè)時(shí),需分配不同的camera-module-index,避免沖突(如RK3588支持7路Sensor:6路MIPI+1路DVP)。
(2)驅(qū)動(dòng)框架:基于I2C+V4L2 Subdev
RK平臺(tái)Camera驅(qū)動(dòng)遵循Linux標(biāo)準(zhǔn)框架,核心是CIS驅(qū)動(dòng)(Sensor驅(qū)動(dòng)),基于I2C總線(Sensor與主控通信)和V4L2 Subdev(與上層框架交互),關(guān)鍵組成如下:
|
核心組件
|
作用
|
|
struct i2c_driver
|
I2C驅(qū)動(dòng)結(jié)構(gòu)體,定義probe(設(shè)備匹配)、remove(設(shè)備卸載)、匹配表等
|
|
struct v4l2_subdev_ops
|
V4L2子設(shè)備操作集,包含core(電源/ IOCTL)、video(流控制)、pad(格式)
|
|
關(guān)鍵API
|
set_fmt(設(shè)輸出格式)、get_fmt(獲格式)、s_stream(啟停流)等
|
比如i2c_driver的示例代碼(簡(jiǎn)化):
staticconststructof_device_id os04a10_of_match[] = {{ .compatible ="ovti,os04a10"},// 與DTS匹配{},};staticstructi2c_driver os04a10_i2c_driver = {.driver = {.name ="os04a10",.of_match_table = os04a10_of_match,},.probe = os04a10_probe,// 設(shè)備匹配成功后執(zhí)行.remove= os04a10_remove,};module_i2c_driver(os04a10_i2c_driver);
3.必掌握:核心技術(shù)概念
搞懂這些概念,才能應(yīng)對(duì)復(fù)雜場(chǎng)景(如HDR、多攝):
(1)HDR模式:高動(dòng)態(tài)范圍成像
RKISP支持2幀(RK3568)或3幀(RV1126/RK3588)HDR合成,原理是采集不同曝光時(shí)間的幀(短幀-欠曝、中幀-正常、長(zhǎng)幀-過(guò)曝),通過(guò)ISP合成高動(dòng)態(tài)范圍圖像,數(shù)據(jù)鏈路如下:

(2)RAW存儲(chǔ)格式:緊湊vs非緊湊
RAW是Sensor輸出的原始數(shù)據(jù),存儲(chǔ)格式影響內(nèi)存占用和處理效率:
?非緊湊型:10bit/12bit數(shù)據(jù)按16bit存儲(chǔ)(高位對(duì)齊),內(nèi)存占用高,但處理簡(jiǎn)單,適用于VICAP采集(如RV1126 DVP僅支持非緊湊);
?緊湊型:12bit數(shù)據(jù)按8bit緊湊存儲(chǔ)(4字節(jié)存3個(gè)像素),內(nèi)存占用低,適用于ISP直接處理。
(3)多攝同步(RK3588專屬)
RK3588支持多攝同步,解決多Sensor數(shù)據(jù)時(shí)序不一致問(wèn)題,主要有兩種模式:
?Master-Slave:從設(shè)備等待主設(shè)備的同步信號(hào),僅收到信號(hào)才輸出數(shù)據(jù);
?Master-Master:主設(shè)備發(fā)送同步信號(hào),從設(shè)備獨(dú)立輸出,收到信號(hào)后同步(支持當(dāng)前幀完成后同步或立即同步)。
核心知識(shí)點(diǎn)腦圖
為了方便記憶,整理成腦圖如下:

二、RK Camera實(shí)戰(zhàn)調(diào)試方法
開(kāi)發(fā)中遇到“Camera不識(shí)別”“預(yù)覽閃爍”“圖像發(fā)紫”等問(wèn)題,掌握以下調(diào)試方法,能快速定位問(wèn)題。
1.必備工具:media-ctl + v4l2-ctl
這兩個(gè)工具是RK Camera調(diào)試的“左右手”,前者管理媒體拓?fù)洌笳卟僮饕曨l設(shè)備。
(1)media-ctl:查看/配置拓?fù)?/span>
# 1. 查看media設(shè)備拓?fù)洌╔為0/1/2,需枚舉)media-ctl -p -d /dev/mediaX# 示例輸出:會(huì)顯示Sensor→MIPI→ISP的鏈路,確認(rèn)是否“ENABLED”# 2. 設(shè)置Sensor輸出格式(如OS04A10設(shè)2688x1520,RAW12)media-ctl -d /dev/media0--set-v4l2'"os04a10 1-0036":0[fmt:SBGGR12_1X12/2688x1520]'# 3. 切換ISP數(shù)據(jù)鏈路(如從ISPP切到MainPath抓RAW)media-ctl -l'"rkisp-isp-subdev":2->"rkisp_mainpath":0[1]'
(2)v4l2-ctl:抓幀/設(shè)控制參數(shù)
# 1. 抓RAW圖(設(shè)分辨率、格式,保存到/tmp)v4l2-ctl -d /dev/video0--set-fmt-video=width=2688,height=1520,pixelformat=RG10--stream-mmap=4 # 4個(gè)MMAP緩存--stream-count=1 # 抓1幀--stream-to=/tmp/cap.raw # 保存路徑--stream-skip=2# 跳過(guò)前2幀(避免初始幀異常)# 2. 設(shè)置曝光和增益(需先找到Sensor的subdev節(jié)點(diǎn),如/dev/v4l-subdev4)v4l2-ctl -d /dev/v4l-subdev4--set-ctrl'exposure=1216,analogue_gain=10'# 3. 查看支持的控制參數(shù)v4l2-ctl -d /dev/v4l-subdev4 --list-ctrls
2. Debug信息:定位問(wèn)題的“線索”
遇到問(wèn)題先看日志,RK提供了多個(gè)Debug入口:
(1)查看proc文件
proc文件包含ISP/VICAP的實(shí)時(shí)狀態(tài),比如:
# 查看ISP狀態(tài)(幀號(hào)、格式、模塊開(kāi)關(guān))cat/proc/rkisp0# 查看VICAP狀態(tài)(輸入格式、幀率、中斷統(tǒng)計(jì))cat/proc/rkcif_mipi_lvds
示例輸出關(guān)鍵信息:
?Input Format:SGBRG10_1X10 Size:2688x1520@30fps:輸入格式和幀率;
?ErrCnt:0:無(wú)錯(cuò)誤中斷,若不為0,可能是MIPI鏈路異常;
?HDRTMO ON:HDR TMO模塊已開(kāi)啟。
(2)寄存器Dump
若懷疑硬件配置問(wèn)題,可Dump ISP/VICAP寄存器:
# RV1126 Dump ISP寄存器(地址0xffb50000,長(zhǎng)度0x10000)io-4-l0x100000xffb50000 > /tmp/isp.reg# RK3568 Dump ISP寄存器io-4-l0x100000xfdff0000 > /tmp/isp.reg
(3)開(kāi)啟驅(qū)動(dòng)日志
# 開(kāi)啟ISP驅(qū)動(dòng)日志(n=0~3,3級(jí)最詳細(xì))echo3 > /sys/module/video_rkisp/parameters/debug# 開(kāi)啟ISPP驅(qū)動(dòng)日志echo3 > /sys/module/video_rkispp/parameters/debug# 查看日志dmesg | grep -i"rkisp"
3.常見(jiàn)問(wèn)題排查:實(shí)戰(zhàn)案例
(1)問(wèn)題1:預(yù)覽閃爍
排查步驟:
1.開(kāi)啟AE日志:AE(自動(dòng)曝光)異常是閃爍的常見(jiàn)原因,開(kāi)啟日志查看統(tǒng)計(jì)值:
exportpersist_camera_engine_log=0x1ff3# 開(kāi)啟AE logrkisp_demo# 運(yùn)行測(cè)試程序
1.分析日志:
?若TmoMeanLuma(TMO合成后亮度)跳變,是TMO參數(shù)不匹配,需調(diào)整IQ參數(shù);
?若MeanLuma穩(wěn)定但畫(huà)面閃爍,是ISP后處理模塊問(wèn)題,需聯(lián)系瑞芯微工程師;
?若time(曝光時(shí)間)和gain(增益)同時(shí)變化,檢查生效幀配置(如sensor的time通常n+2幀生效,需在IQ文件中設(shè)置time_delay=2)。
1.測(cè)試線性度:若gain線性度差,會(huì)導(dǎo)致亮度跳變,測(cè)試方法:
?蓋毛玻璃(均勻入光),固定gain=1,抓10ms/20ms/30ms的RAW圖;
?統(tǒng)計(jì)亮度值,減去黑電平(鏡頭遮黑抓圖),若亮度與曝光時(shí)間成直線,線性度正常。
(2)問(wèn)題2:光源處紫色溢出
排查步驟:
1.線性模式:檢查gain值是否超Sensor手冊(cè)限制(如驅(qū)動(dòng)換算的gain寄存器值是否合法);
2.HDR模式:
?查看內(nèi)核日志是否有MIPI報(bào)錯(cuò)(dmesg | grep -i "mipi err"),若有是短幀偏移導(dǎo)致合成錯(cuò)位;
?確認(rèn)短幀曝光是否超限制(如某sensor短幀最大2ms,若IQ配置3ms,實(shí)際僅2ms生效,導(dǎo)致合成ratio異常)。
調(diào)試流程圖

4.實(shí)用技巧
?單獨(dú)更新驅(qū)動(dòng):無(wú)需重新編譯內(nèi)核,生成補(bǔ)丁后應(yīng)用:
# 生成補(bǔ)丁(A=老版本commit,B=新版本commit)git format-patch A..B drivers/media/... -o tmp_patch# 應(yīng)用補(bǔ)丁git am tmp_patch/*
?查看驅(qū)動(dòng)版本:
cat/sys/module/video_rkisp/parameters/version
?判斷ISP加載狀態(tài):
# 查看video節(jié)點(diǎn)名稱,確認(rèn)RKISP節(jié)點(diǎn)grep''/sys/class/video4linux/video*/name# 查看拓?fù)涫欠裾?/span>media-ctl -p -d /dev/mediaX
三、總結(jié)與資源推薦
開(kāi)發(fā)要點(diǎn)總結(jié)
1.硬件層面:明確芯片的VI模塊能力(如RK3588的多攝同步),理清Sensor→VICAP→ISP的數(shù)據(jù)鏈路;
2.軟件層面:DTS配置要注意compatible、data-lanes等關(guān)鍵參數(shù),驅(qū)動(dòng)遵循I2C+V4L2 Subdev框架;
3.調(diào)試層面:先用media-ctl/v4l2-ctl驗(yàn)證鏈路,再通過(guò)proc日志和寄存器定位問(wèn)題,常見(jiàn)問(wèn)題優(yōu)先查AE日志和參數(shù)限制。
參考資源
?官方文檔:《Rockchip_Driver_Guide_VI_CN》(本文基于v1.1.1版本);
希望這篇文章能幫你快速上手RK平臺(tái)Camera開(kāi)發(fā)!如果有其他問(wèn)題,歡迎在評(píng)論區(qū)交流~
-
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219006 -
瑞芯微
+關(guān)注
關(guān)注
27文章
792瀏覽量
54286 -
Camera
+關(guān)注
關(guān)注
1文章
85瀏覽量
22212
發(fā)布評(píng)論請(qǐng)先 登錄
第18章 BSD Sockets基礎(chǔ)知識(shí)
第29章 NTP網(wǎng)絡(luò)時(shí)間協(xié)議基礎(chǔ)知識(shí)
第31章 Telnet遠(yuǎn)程登錄基礎(chǔ)知識(shí)
第33章 SMTP簡(jiǎn)單郵件傳輸協(xié)議基礎(chǔ)知識(shí)
絕對(duì)好貨 LABVIEW入門(mén)與實(shí)戰(zhàn)開(kāi)發(fā)100例
初級(jí)小白實(shí)戰(zhàn)資料,零基礎(chǔ)入門(mén)rk3399平臺(tái)下linux4.4+android8.1開(kāi)發(fā)
關(guān)于Arduino入門(mén)必備基礎(chǔ)知識(shí)點(diǎn)總結(jié)的太棒了
javaweb從入門(mén)到實(shí)戰(zhàn)
【北京迅為】iTOP-RK3568OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)GPIO基礎(chǔ)知識(shí)
一文吃透RK平臺(tái)OTA升級(jí)開(kāi)發(fā):從邏輯到調(diào)試的完整指南
RK平臺(tái)Linux IOMMU開(kāi)發(fā):從原理到實(shí)戰(zhàn)
RK?平臺(tái)?Vendor Storage?開(kāi)發(fā)指南:基礎(chǔ)知識(shí)、流程與實(shí)用技巧
RK平臺(tái)Camera開(kāi)發(fā)入門(mén):從基礎(chǔ)知識(shí)點(diǎn)到實(shí)戰(zhàn)調(diào)試
評(píng)論