瑞芯微 | 摄像头ov13850移植笔记
《1.瑞芯微rk356x板子快速上手》
《2.Linux驅動|瑞芯微rtc-hym8563移植筆記》
《3.Linux驅動 | Linux內核 RTC時間架構-基于瑞芯微》
0、環境
soc : rk3568 board: EVB1-DDR4-V10 軟 件:Android 11 Linux:4.19.232一、ov13850簡介
1. 產品參數
- 品牌:Omnivision
- 型號:CMK-OV13850
- 接口:MIPI
- 像素:1320W
OV13850彩色圖像傳感器是一款低電壓、高性能1/3.06英寸1320萬像素CMOS圖像傳感器,使用OmniBSI+?技術提供了單-1320萬像素(4224×3136)攝像頭的功能。通過串行攝像頭控制總線(SCCB)接口的控制,它提供了全幀、下采樣、開窗的10位MIPI圖像。
OV13850擁有一個能夠在10位1320萬像素分辨率下以每秒24幀(fps)的速度運行的圖像陣列,用戶可以完全控制圖像質量、格式和輸出數據傳輸。所有需要的圖像處理功能,包括曝光控制、白平衡、缺陷像素消除等,都可以通過SCCB接口進行編程。
此外,OmniBSI圖像傳感器使用專有的傳感器技術,通過減少或消除固定圖案噪聲、污跡等常見的圖像污染光源來提高圖像質量,從而產生干凈、完全穩定的彩色圖像。
為了提供定制信息,OV13850包括一個單編程(OPT)存儲器。OV13850擁有最多4車道的MIPI接口。
OV13850適用于低功耗相機模塊。
以下是測試用的攝像頭&擴展板:
2. 特性
●鏡頭尺寸:1/3.06英寸
●像素大小:1.12毫米×1.12毫米
●31.2°CRA為6mm z高度
●可編程控制幀速率,鏡像和翻轉,裁剪和窗口
●1320萬像素AT30fps
●雙線串行總線控制(SCCB)
●閃光燈輸出控制閃光
●支持輸出格式:10位RAW RGB
●支持圖像大小:13.2MP(4224×3136)、10MP(4224×2376)、4K2K(3840×2160)、EIS 1080P(2112×1188)、EIS 720P(1408×792)、more3
●支持2×2 Binning
●可達4車道MIPI串行輸出接口
●標準系列SCCB接口
●8k bit的嵌入式一次性可編程(OTP)存儲器(見側注)
●兩個片上鎖相環(PLLs)
●可編程控制:增益、曝光、幀率、圖像大水、水平反射鏡、垂直翻轉裁剪和平移
●內置溫度傳感器
●圖像質量控制:缺陷校正,自動黑電平校準,鏡頭陰影校正,和高度計行HDR。
●保證傳感器結溫:-300C到+850C
●電源核心:1.14V-1.26V;模擬:2.6-3.0V輸入/輸出:1.7-3.0V
●封裝:PLCC40
3. ov13850引腳圖
4. ov13850功能模塊
定時脈沖發生器輸出時鐘來訪問成像陣列的行,預先填充電荷并且按順序對數組的行進行采樣。
在預先填充電荷和采樣的時間間隔內,每個像素點的電荷曝光時減少入射光。
這是在滾動快門的體系結構的曝光時間。
曝光時間通過調整預先填充電荷和采樣之間的時間間隔控制。
在每一行的像素數據采樣后,通過模擬電路(AMP)進一步處理:糾正偏移量和將數據乘以相應的增益。
模擬處理后通過10位ADC的輸出數組中的每個像素的數據。
ISP(image sensor processor)通過圖像輸出接口單元,經過mipi接口(MCP/MDP)將圖像數據發送出去。
5. 像素數組
OV13850傳感器的圖像數組4256列3152行(13414912像素)
顏色過濾器是安排在Bayer模式
Binning mode 2x2 binning
Binning mode 通常用于低分辨率
6. mirror 和 flip
OV13850提供圖像mirror(左右翻轉) 和 flip(上下翻轉)模式
二、驅動移植
瑞芯微支持的攝像頭,有個support list,
此次從該list中選擇了ov13850
1. 驅動源文件及對應腳本
默認sdk里面已經將支持的所有攝像頭驅動都添加到了內核,所以不需要移植該驅動了,
但是還是要確認下移植驅動對應的一些信息
- 源程序
- kernel/drivers/media/i2c/Makefile
- kernel/drivers/media/i2c/Kconfig
- 驅動對應的宏開關
kernel/arch/arm64/configs/rockchip_defconfig
581 CONFIG_VIDEO_OV13850=y2. 設備樹
1)典型ov系列攝像頭鏈接示意圖
ov系列攝像頭與SOC連接的主要的引腳有:
i2c、rst、pwdn、mclk、MIPI Clk、MIPI DATA
這幾根線是驅動工程師必須捋清楚的
2)電路圖
本次我們直接將攝像頭插在公版的視頻接口,用的是通道0,使用了4個lane【不知道具體硬件信息就問硬件工程師】
由電路圖可知,幾個關鍵引腳關系:
- reset信號:GPIO3 B6
- power down信號:GPIO4 B4
- I2C通道:4
- clock:cif
3)設備樹節點
參考sdk中其他平臺的ov13850節點來填寫
kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsiov13850: ov13850@10 {status = "okay";compatible = "ovti,ov13850";reg = <0x10>;clocks = <&cru CLK_CIF_OUT>;clock-names = "xvclk";power-domains = <&power RK3568_PD_VI>;pinctrl-names = "default";pinctrl-0 = <&cif_clk>;reset-gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_HIGH>;pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back"; rockchip,camera-module-name = "ZC-OV13850R2A-V1";rockchip,camera-module-lens-name = "Largan-50064B31";port {ov13850_out: endpoint {remote-endpoint = <&mipi_in_ucam0>;data-lanes = <1 2 3 4>;};};};114 &csi2_dphy0 { 115 status = "okay"; 116 117 ports { 118 #address-cells = <1>; 119 #size-cells = <0>; 120 port@0 { 121 reg = <0>; 122 #address-cells = <1>; 123 #size-cells = <0>; 124 125 mipi_in_ucam0: endpoint@1 { 126 reg = <1>; 127 remote-endpoint = <&ov13850_out>; 128 data-lanes = <1 2 3 4>; 129 }; …… 152 };設備樹的信息最終轉換成i2c_client,并傳遞給ov13850驅動ov13850_probe()
compatible = “ovti,ov13850”;與驅動的of_match_table 保持一致
關于攝像頭驅動,
彭老師后面會繼續更一篇文章講解。
3. 安卓配置文件
在以下兩個文件增加對應攝像頭信息,
hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml hardware/rockchip/camera/etc/camera/camera3_profiles.xml一口君直接參考的其他文件,
然后找一個相近型號的攝像頭修改的
三、查看攝像頭相關信息
1. 開機log
移植成功后,確認下對應的驅動log
10-26 17:58:54.659 0 0 I ov13850 4-0010: driver version: 00.01.05 10-26 17:58:54.659 0 0 W ov13850 4-0010: Failed to get power-gpios, maybe no use 10-26 17:58:54.659 0 0 W ov13850 4-0010: 4-0010 supply avdd not found, using dummy regulator 10-26 17:58:54.659 0 0 I ov13850 4-0010: Linked as a consumer to regulator.0 10-26 17:58:54.659 0 0 W ov13850 4-0010: 4-0010 supply dovdd not found, using dummy regulator 10-26 17:58:54.659 0 0 W ov13850 4-0010: 4-0010 supply dvdd not found, using dummy regulator 10-26 17:58:54.660 0 0 E ov13850 4-0010: could not get default pinstate 10-26 17:58:54.660 0 0 E ov13850 4-0010: could not get sleep pinstate 10-26 17:58:54.665 0 0 I ov13850 4-0010: Detected OV00d850 sensor, REVISION 0xb2 10-26 17:58:54.665 0 0 I rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_ov13850 4-0010:bus type 42. 查看ov13850設備
驅動加載成功后,會有以下信息
- 查看攝像頭設備節點:
3. 查看sys文件系統中文件信息
內核會為攝像頭在目錄/sys/class/video4linux下分配設備信息描述文件
rk3568_r:/ # grep ov13850 /sys/class/video4linux/v*/name grep ov13850 /sys/class/video4linux/v*/name /sys/class/video4linux/v4l-subdev3/name:m00_b_ov13850 4-0010 rk3568_r:/ # grep "" /sys/class/video4linux/v*/name | grep mainpath grep "" /sys/class/video4linux/v*/name | grep mainpath /sys/class/video4linux/video0/name:rkisp_mainpath4. 查看拓撲 media-ctl -d /dev/media0 -p
rk3568_r:/ # media-ctl -d /dev/media0 -p media-ctl -d /dev/media0 -p Opening media device /dev/media0 Enumerating entities Found 13 entities Enumerating pads and links Media controller API version 0.0.255 Media device information ------------------------ driver rkisp-vir0 model rkisp0 serial bus info hw revision 0x0 driver version 0.0.255 Device topology - entity 1: rkisp-isp-subdev (4 pads, 7 links) type V4L2 subdev subtype Unknown device node name /dev/v4l-subdev0 pad0: Sink [fmt:SBGGR10/4224x3136 crop.bounds:(0,0)/4096x3072 crop:(0,0)/4096x3072] <- "rkisp-csi-subdev":1 [] <- "rkisp_rawrd0_m":0 [] <- "rkisp_rawrd2_s":0 [] pad1: Sink <- "rkisp-input-params":0 [] pad2: Source [fmt:YUYV2X8/4096x3072 crop.bounds:(0,0)/4096x3072 crop:(0,0)/4096x3072] -> "rkisp_mainpath":0 [] -> "rkisp_selfpath":0 [] pad3: Source -> "rkisp-statistics":0 [] - entity 6: rkisp-csi-subdev (6 pads, 5 links) type V4L2 subdev subtype Unknown device node name /dev/v4l-subdev1 pad0: Sink <- "rockchip-csi2-dphy0":1 [] pad1: Source -> "rkisp-isp-subdev":0 [] pad2: Source -> "rkisp_rawwr0":0 [] pad3: Source pad4: Source -> "rkisp_rawwr2":0 [] pad5: Source -> "rkisp_rawwr3":0 [] - entity 13: rkisp_mainpath (1 pad, 1 link) type Node subtype V4L device node name /dev/video0 pad0: Sink <- "rkisp-isp-subdev":2 [] - entity 19: rkisp_selfpath (1 pad, 1 link) type Node subtype V4L device node name /dev/video1 pad0: Sink <- "rkisp-isp-subdev":2 [] - entity 25: rkisp_rawwr0 (1 pad, 1 link) type Node subtype V4L device node name /dev/video2 pad0: Sink <- "rkisp-csi-subdev":2 [] - entity 31: rkisp_rawwr2 (1 pad, 1 link) type Node subtype V4L device node name /dev/video3 pad0: Sink <- "rkisp-csi-subdev":4 [] - entity 37: rkisp_rawwr3 (1 pad, 1 link) type Node subtype V4L device node name /dev/video4 pad0: Sink <- "rkisp-csi-subdev":5 [] - entity 43: rkisp_rawrd0_m (1 pad, 1 link) type Node subtype V4L device node name /dev/video5 pad0: Source -> "rkisp-isp-subdev":0 [] - entity 49: rkisp_rawrd2_s (1 pad, 1 link) type Node subtype V4L device node name /dev/video6 pad0: Source -> "rkisp-isp-subdev":0 [] - entity 55: rkisp-statistics (1 pad, 1 link) type Node subtype V4L device node name /dev/video7 pad0: Sink <- "rkisp-isp-subdev":3 [] - entity 61: rkisp-input-params (1 pad, 1 link) type Node subtype V4L device node name /dev/video8 pad0: Source -> "rkisp-isp-subdev":1 [] - entity 67: rockchip-csi2-dphy0 (2 pads, 2 links) type V4L2 subdev subtype Unknown device node name /dev/v4l-subdev2 pad0: Sink <- "m00_b_ov13850 4-0010":0 [] pad1: Source -> "rkisp-csi-subdev":0 [] - entity 70: m00_b_ov13850 4-0010 (1 pad, 1 link) type V4L2 subdev subtype Sensor device node name /dev/v4l-subdev3 pad0: Source [fmt:SBGGR10/4224x3136] -> "rockchip-csi2-dphy0":0 []從entity70信息中可以看到:
- 該Entity完整的名稱是:m00_b_ov13850 4-0010
- 它是一個V4L2 subdev(Sub-Device) Sensor
- 它對應的節點是/dev/v4l-subdev3,應用程序(如v4l2-ctl)可以打開它,并進行配置
- 它僅有一個輸出(Source)節點,記為pad0
- 它的輸出格式是[fmt:SBGGR10/4224x3136],其中SBGGR10是一種mbus-code的簡稱
- 它的Source pad0 鏈接到"rockchip-csi2-dphy0"的pad0,并且當前的狀態是 ENABLED。
三、拍照測試
1. 抓幀
rk3568_r:/ # v4l2-ctl -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat=NV12 --stream-mmap=3 --stream-to=/sdcard/out.yuv --stream-skip=9 --stream-count=1 m-mmap=3 --stream-to=/sdcard/out.yuv --stream-skip=9 --stream-count=1 < <<<<<<<<< 7.51 fps <【看到<<<<<<<<< 7.51 fps 說明成功】
參數說明
-d: 攝像頭對應設備文件 --set-fmt-video:指定了寬高及pxielformat(用FourCC表示)。NV12即用FourCC表示的pixelformat --stream-mmap:指定buffer的類型為mmap,即由kernel分配的物理連續的或經過iommu映射的buffer --stream-to:指定幀數據保存的文件路徑 --stream-skip:指定丟棄(不保存到文件)前3幀 --stream-count:指定抓取的幀數,不包括--stream-skip丟棄的數量其他參數 --set-selection,指定對輸入圖像進行裁剪。特別是當RKISP1的前級大小發生變化時要保證selection不大于前級輸出大小。RKCIF的裁剪則是通過--set-crop參數設置的 --stream-poll,該選項指示v4l2-ctl采用異步IO,即在dqbuf前先用select等等幀數據完成,從而保證dqbuf不阻塞。否則dqbuf將會阻塞直到有數據幀到來2. 顯示圖片:
將文件**/sdcard/out.yuv從板子通過adb pull**命令拷貝出來,
運行于windows下: adb pull /sdcard/out.yuv再拷貝到ubuntu中,執行以下命令顯示圖片【用其他可以打開yuv格式圖片的工具也可以】
ffplay out.yuv -f rawvideo -pixel_format nv12 -video_size 800x600【拍照時選擇其他較高分辨率會出錯,暫時還沒解決這個問題,有知道的可以聯系我:yikoupeng】
四、參數設置
1. 顯示攝像頭參數
顯示攝像頭參數
rk3568_r:/ # v4l2-ctl -d /dev/video0 -l v4l2-ctl -d /dev/video0 -l User Controls exposure 0x00980911 (int) : min=4 max=3324 step=1 default=1536 value=1536 Image Source Controls vertical_blanking 0x009e0901 (int) : min=192 max=29631 step=1 default=192 value=192 horizontal_blanking 0x009e0902 (int) : min=576 max=576 step=1 default=576 value=576 flags=read-only analogue_gain 0x009e0903 (int) : min=16 max=248 step=1 default=16 value=16 Image Processing Controls link_frequency 0x009f0901 (intmenu): min=0 max=0 default=0 value=0 flags=read-only pixel_rate 0x009f0902 (int64) : min=0 max=120000000 step=1 default=120000000 value=120000000 flags=read-only test_pattern 0x009f0903 (menu) : min=0 max=4 default=0 value=02. 增加曝光exposure
exposure值區間為: 4-3324
命令實例:
3. 增加圖片亮度analogue_gain
analogue_gain用于設置顯示的圖像的亮度
analogue_gain值區間:16-248
命令實例:
v4l2-ctl -d /dev/video0 --set-ctrl analogue_gain=240analogue_gain=16現象
analogue_gain=244現象【效果非常明顯】
4. 測試顯示信息test_pattern
參數test_pattern,可以用于測試顯示圖像
- 0:攝像頭
- 1-3 測試圖片
命令實例:
test_pattern = 1
test_pattern = 2
test_pattern = 3
5. 修改Entity的format、size
舉例一,GC2053攝像頭支持多個分辨率的輸出,默認為1920x1080。現將輸出分辨率改為640x480:
media-ctl -d/dev/media0 --set-v4l2' "m00_b_ov13850 4-0010":0[fmt:SBGGR10//640x480]'修改GC2053輸出后,rkisp-isp-subdev的大小及video device crop也相應要修改。因為后級的大小不能大于前級的大小。
~/>$ media-ctl -d/dev/media0 --set-v4l2 ' "rkisp-isp-subdev":0[fmt:SBGGR10/640x480]' ~/>$ media-ctl -d/dev/media0 --set-v4l2 ' "rkisp-isp-subdev":0[crop: (0, 0)/640x480]' ~/>$ media-ctl -d/dev/media0 --set-v4l2 ' "rkisp-isp-subdev":2[crop: (0, 0)/640x480]' ~/>$ v4l2-ctl -d/dev/video0\ --set-selection=target=crop, top=0, left=0, width=640, height=480五、遇到問題解決
1. 解決閃退
主要是camera3_profiles_rk356x.xml和camera3_profiles.xml這兩個文件中沒有ov13850的信息
所以找到這兩個文件,增加相對應的攝像頭信息
改文件位于sdk的目錄如下:
內容比較多,只貼出我修改那一段
【我將其他攝像頭都刪除了】
文件camera3_profiles.xml參數的說明,瑞芯微官方有相應的說明文檔
2. app 提示沒有權限連接&打開設備失敗
10-24 15:20:15.535 1668 1668 D CAM_Camera2OneCamMgr: Getting First BACK Camera 10-24 15:20:15.535 1668 1668 I CameraManagerGlobal: Connecting to camera service 10-24 15:20:15.539 346 346 W ServiceManager: Permission failure: android.permission.CAMERA_OPEN_CLOSE_LISTENER from uid=10090 pid=1668 10-24 15:20:15.542 1668 1668 D CAM_Camera2OneCamMgr: Getting First FRONT Camera 10-24 15:20:15.543 1668 1668 W CAM_Camera2OneCamMgr: No front-facing camera found,try to find external facing camera. 10-24 15:20:15.544 1668 1668 W CAM_Camera2OneCamMgr: No external camera found.該log位于以下文件
./packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java:172修改文件
packages/apps/Camera2/AndroidManifest.xml增加下面兩處,會解決連接ManagerService 錯誤問題
<uses-permission android:name="android.permission.CAMERA_OPEN_CLOSE_LISTENER"/> android:sharedUserId="android.uid.system"同時將設備樹文件
將mipi_in_ucam0里的reg修改為1,如果有其他攝像頭信息,一次往后填寫或者刪除。
【這個reg是什么意思,有知道的老鐵可以給我留言】
3. APP打開設備失敗
從log看,沒有任何permission問題,攝像頭也打開了,但是就是連接失敗,主要是xml文件的sensorType 設置不對
hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml hardware/rockchip/camera/etc/camera/camera3_profiles.xml找到這兩個文件下面的值
<sensorType value="SENSOR_TYPE_RAW"/> <!-- SENSOR_TYPE_SOC or SENSOR_TYPE_RAW -->修改為
<sensorType value="SENSOR_TYPE_SOC"/> <!-- SENSOR_TYPE_SOC or SENSOR_TYPE_RAW -->六、后續
后面還有一些工作需要進一步研究:
有一起玩瑞芯微平臺的老鐵,后臺猛戳我
總結
以上是生活随笔為你收集整理的瑞芯微 | 摄像头ov13850移植笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 范德堡大学计算机,范德堡大学计算机专业博
- 下一篇: java每五分钟执行一次_Cron表达式