光线经过sensor之后,sensor芯片经过ADC转换生成图像数据,在经过mipi总线进入SOC,进入SOC之后经过isp进行图像处理。由此可以看出,camera驱动有三部分组成,
a) 代码路径和硬件相关的驱动有3部分,分别为sensor相关,mipi相关,isp相关,需要找到正确的代码路径,并补齐缺失的代码,其中RK3399 SOC使用isp1类型。
sensor相关: kernel/drivers/media/i2c/ov8858.c
mipi相关:kernel/drivers/phy/rockchip/phy-rockchip-mipi-rx.c
isp相关:kernel/drivers/media/platform/rockchip/isp1/rkisp1.c
v4l2驱动框架代码路径:
kernel/drivers/media/v4l2-core、kernel/drivers/media/common/videobuf2
b) 使能宏配置
- CONFIG_VIDEO_DEV=y
- CONFIG_VIDEO_OV8858=y
- CONFIG_VIDEO_v4l2=y
- CONFIG_VIDEO_v4l2_I2C=y
- CONFIG_VIDEO_v4l2_SUBDEV_API=y
- CONFIG_VIDEOBUF2_v4l2=y
- CONFIG_v4l2_FWNODE=y
- CONFIG_v4l2_MEM2MEM_DEV=y
- CONFIG_MEDIA_CONTROLLER=y
- CONFIG_VIDEOMODE_HELPERS=y
- CONFIG_NO_GKI=y
- CONFIG_VIDEO_ROCKCHIP_RKisp1=y
- CONFIG_PHY_ROCKCHIP_mipi_RX=y
复制代码
2.3. 调试在调试之前,需要理清数据传输路径、确定调试目标、整理可用的工具。上面第2步已经配置与使能了各模块的代码,它们在主板上会生成各个设备拓扑节点,并组成数据路径。
a) 验证DTS配置是否生成
(, 下载次数: 0)
(, 下载次数: 52)
(, 下载次数: 0)
问题1:camera sensor未成功挂接到i2c总线上现象:日志打印 ov8858 1-0036: Unexpected sensor id(000000), ret(-5),表明i2c1读取sensor id失败;打印 rk3x-i2c ff110000.i2c: timeout, ipd: 0x00, state: 2,表明i2c1通信超时。
思路1:1、测量电源电压排查i2c1供电 2、测量系统启动过程中i2c1的波形 3、检查clock配置
结果:1、供电正确,启动过程中没有波形 2、clock配置正确
分析:无法直接排查启动过程中i2c1通信超时的原因,继续分析
思路2:系统启动后,在i2c1下手动挂接1-0036
结果:挂接成功
分析:系统启动过程中有其他依赖的因素导致i2c1无法通信,这个依赖因素在启动过程中又被解决了。在日志中排查相关因素,比如电源。发现在ov8858注册失败后,vcc3v3_sys才被申请。显然,ov8858注册依赖i2c1通信, i2c1通信依赖电源vcc3v3_sys。
解决方式:
ov8858 驱动加载使用late_initcall接口延迟,使vcc3v3_sys在i2c1通信前被申请。
b) v4l2相关的节点是否生成通过上面可以知道不管是sensor、mipi还是isp,统一描述为struct v4l2_subdev对象,然后将这个对象struct v4l2_subdev通过不同函数注册到v4l2框架中。如下(图3: 设备注册函数)分别有不同的注册函数。
图3:设备注册函数
注册成功且数据通路正确的话会出现以下节点。
问题2:没有生成/dev/v4l-subdevx节点思路1:根据图3,通过日志排查 v4l-subdevx相关的sensor、mipi、isp设备是否注册成功
结果:sensor ov8858注册失败,
思路1:根据图3,数据传输路径的设备节点是sensor->mipi->isp, 通过日志判断这三个设备是否注册成功,且注册顺序是否正确
结果:通过打印发现sensor注册失败,失败代码在v4l2_async_notifier_try_complete 中,表明列表根节点v4l2_dev为空。
分析:sensor应该为v4l2_dev列表的根节点,不应走到这里。再排查三个设备节点的注册顺序,发现为isp->mipi->ov8858。
思路2:调整设备加载的接口方法,问题1中已经将ov8858的加载修改成late_initcall,需要将mipi 和 isp加载顺序调整得更靠后。
结果:顺序仍旧不正确
思路3:通过日志对比,找出isp设备加载的调用入口
结果:rkisp1_clr_unready_dev是启动isp的入口,调整后顺序正确,sensor、mipi、isp注册成功。且/dev/v4l-subdevx节点生成。
c) 通过camera_demo操作/dev/video0 获取数据流,验证驱动适配是否成功 3. 总结本文没有介绍的相机上层框架,如HDI接口、Pipeline模型等。本文重点讲述了在RK3399主板上与camera设备驱动相关的如ov8858、isp1、mipi-dpy的底层适配步骤以及总结了在适配过程中出现的重点问题。在OpenAtom OpenHarmony(简称“OpenHarmony”) V3.2Release上主要的适配工作也在此处,此后mipi camera可通过系统相机应用完成预览、拍照等交互。
4. 参考链接