首页 » 科学 » 摄像头ov13850移植笔记_年夜众_"大众

摄像头ov13850移植笔记_年夜众_"大众

落叶飘零 2024-12-20 16:12:36 0

扫一扫用手机浏览

文章目录 [+]

此外,OmniBSI图像传感器利用专有的传感器技能,通过减少或肃清固定图案噪声、污迹等常见的图像污染光源来提高图像质量,从而产生干净、完备稳定的彩色图像。

为了供应定制信息,OV13850包括一个单编程(OPT)存储器。
OV13850拥有最多4车道的MIPI接口。

摄像头ov13850移植笔记_年夜众_"大众 摄像头ov13850移植笔记_年夜众_"大众 科学

OV13850适用于低功耗相机模块。

摄像头ov13850移植笔记_年夜众_ 摄像头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里面已经将支持的所有摄像头驱动都添加到了内核,以是不须要移植该驱动了,

但是还是要确认下移植驱动对应的一些信息

源程序

rk_android11.0_sdk_220718\kernel\drivers\media\i2c\ov13850.c rk_android11.0_sdk_220718\kernel\include\config\video\ov13850.h

kernel/drivers/media/i2c/Makefile

115 obj-$(CONFIG_VIDEO_OV13850) += ov13850.o

kernel/drivers/media/i2c/Kconfig

1282 config VIDEO_OV13850 1283 tristate \"大众OmniVision OV13850 sensor support\公众1284 depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API1285 depends on MEDIA_CAMERA_SUPPORT1286 select V4L2_FWNODE1287 ---help---1288 This is a Video4Linux2 sensor driver for the OmniVision1289 OV13850 camera.

驱动对应的宏开关

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.dtsi ov13850: 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 保持同等

@rk_android11.0_sdk\kernel\drivers\media\i2c\ov13850.c#if IS_ENABLED(CONFIG_OF)static const struct of_device_id ov13850_of_match[] = { { .compatible = \公众ovti,ov13850\公众 }, {},};MODULE_DEVICE_TABLE(of, ov13850_of_match);#endifstatic const struct i2c_device_id ov13850_match_id[] = { { \"大众ovti,ov13850\公众, 0 }, { },};static struct i2c_driver ov13850_i2c_driver = { .driver = { .name = OV13850_NAME, .pm = &ov13850_pm_ops, .of_match_table = of_match_ptr(ov13850_of_match), }, .probe = &ov13850_probe, .remove = &ov13850_remove, .id_table = ov13850_match_id,};

关于摄像头驱动,

彭老师后面会连续更一篇文章讲解。

3. 安卓配置文件

在以下两个文件增加对应摄像头信息,

hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xmlhardware/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.0510-26 17:58:54.659 0 0 W ov13850 4-0010: Failed to get power-gpios, maybe no use10-26 17:58:54.659 0 0 W ov13850 4-0010: 4-0010 supply avdd not found, using dummy regulator10-26 17:58:54.659 0 0 I ov13850 4-0010: Linked as a consumer to regulator.010-26 17:58:54.659 0 0 W ov13850 4-0010: 4-0010 supply dovdd not found, using dummy regulator10-26 17:58:54.659 0 0 W ov13850 4-0010: 4-0010 supply dvdd not found, using dummy regulator10-26 17:58:54.660 0 0 E ov13850 4-0010: could not get default pinstate10-26 17:58:54.660 0 0 E ov13850 4-0010: could not get sleep pinstate10-26 17:58:54.665 0 0 I ov13850 4-0010: Detected OV00d850 sensor, REVISION 0xb210-26 17:58:54.665 0 0 I rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_ov13850 4-0010:bus type 42. 查看ov13850设备

驱动加载成功后,会有以下信息

查看摄像头设备节点:

rk3568_r:/ # ls /dev/video -lls /dev/video -lcrw-rw---- 1 media camera 81, 0 2022-10-31 06:56 /dev/video0crw-rw---- 1 media camera 81, 1 2022-10-31 06:56 /dev/video1crw-rw---- 1 media camera 81, 2 2022-10-31 06:56 /dev/video2crw-rw---- 1 media camera 81, 3 2022-10-31 06:56 /dev/video3crw-rw---- 1 media camera 81, 4 2022-10-31 06:56 /dev/video4crw-rw---- 1 media camera 81, 5 2022-10-31 06:56 /dev/video5crw-rw---- 1 media camera 81, 6 2022-10-31 06:56 /dev/video6crw-rw---- 1 media camera 81, 7 2022-10-31 06:56 /dev/video7crw-rw---- 1 media camera 81, 8 2022-10-31 06:56 /dev/video83. 查看sys文件系统中文件信息

内核会为摄像头在目录/sys/class/video4linux下分配设备信息描述文件

rk3568_r:/ # grep ov13850 /sys/class/video4linux/v/namegrep 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 mainpathgrep \"大众\"大众 /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=1m-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=0

2. 增加曝光exposure

exposure值区间为: 4-3324 命令实例:

v4l2-ctl -d /dev/video0 --set-ctrl exposure=33243. 增加图片亮度analogue_gain

analogue_gain用于设置显示的图像的亮度

analogue_gain值区间:16-248

命令实例:

v4l2-ctl -d /dev/video0 --set-ctrl analogue_gain=240

analogue_gain=16征象

analogue_gain=244征象【效果非常明显】

4. 测试显示信息test_pattern

参数test_pattern,可以用于测试显示图像

0:摄像头
1-3 测试图片 命令实例:

v4l2-ctl -d /dev/video0 --set-ctrl test_pattern=0

test_pattern = 1test_pattern = 2test_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的目录如下:

hardware/rockchip/camera/etc/camera/

内容比较多,只贴出我修正那一段 【我将其他摄像头都删除了】

<Profiles cameraId=\公众0\公众 name=\"大众ov13850\"大众 moduleId=\"大众m00\"大众> <Supported_hardware> <hwType value=\"大众SUPPORTED_HW_RKISP1\"大众/> </Supported_hardware> <Android_metadata> <!-- Android static metadata only --> <!-- Color Correction --> <colorCorrection.availableAberrationModes value=\"大众OFF\"大众/> <!-- Control --> <control.availableModes value=\公众OFF\公众/> <control.aeAvailableAntibandingModes value=\公众OFF,50HZ,60Hz,AUTO\"大众/> <control.aeAvailableModes value=\"大众ON,OFF\公众/> <control.aeLockAvailable value=\"大众FALSE\公众/> ………… <sensorType value=\"大众SENSOR_TYPE_RAW\公众/> <!-- SENSOR_TYPE_SOC or SENSOR_TYPE_RAW -->

文件camera3_profiles.xml参数的解释,瑞芯微官方有相应的解释文档

2. app 提示没有权限连接&打开设备失落败

10-24 15:20:15.535 1668 1668 D CAM_Camera2OneCamMgr: Getting First BACK Camera10-24 15:20:15.535 1668 1668 I CameraManagerGlobal: Connecting to camera service10-24 15:20:15.539 346 346 W ServiceManager: Permission failure: android.permission.CAMERA_OPEN_CLOSE_LISTENER from uid=10090 pid=166810-24 15:20:15.542 1668 1668 D CAM_Camera2OneCamMgr: Getting First FRONT Camera10-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,如果有其他摄像头信息,一次今后填写或者删除。

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 };……

【这个reg是什么意思,有知道的老铁可以给我留言】

3. APP打开设备失落败

从log看,没有任何permission问题,摄像头也打开了,但是便是连接失落败,紧张是xml文件的sensorType 设置不对

hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xmlhardware/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 -->六、后续

后面还会持续更新驱动干系的内容,感兴趣的朋友关注我。

标签:

相关文章

语言推广,文化传承与创新发展的桥梁

语言是人类沟通、交流、传承文化的工具,也是民族文化的重要组成部分。在全球化、信息化的时代背景下,语言推广显得尤为重要。本文将从语言...

科学 2025-01-01 阅读0 评论0

语言数模转换,桥梁连接人类与机器的智慧

随着信息时代的到来,人类与机器的互动日益紧密。在这个过程中,语言数模转换技术应运而生,它成为了连接人类与机器智慧的桥梁。本文将探讨...

科学 2025-01-01 阅读0 评论0

语言无穷量的魅力与探索

语言是人类文明的重要组成部分,它承载着历史、文化、情感和智慧。自古以来,人们就不断探索语言的奥秘,试图揭示语言的无穷量。本文将从语...

科学 2025-01-01 阅读0 评论0