背景:RK3288 MIPI OV摄像头 V4L2框架
一.RK MIPI
二.V4L2框架
现在,从设备树开始,分析video0是如何构建起来的。
rk3399-linux.dtsi: compatible = "rockchip,rk3399-cif-isp";在驱动目录下查找rockchip,rk3399-cif-isp
在media/platform/rk-isp10/cif_isp10_v4l2.c-->cif_isp10_v4l2_of_match找到。所以,我这个rk3399 sdk版本下摄像头走rk-isp v4l2框架。
cif_isp10_v4l2_drv_probe-->match = of_match_node(cif_isp10_v4l2_of_match, node); 找到设备树上的cif_isp1: cif_isp@ff920000节点,该节点内容见附录。-->cif_isp10_create 构建ISP-->cif_isp10_pltfrm_soc_init 初始化ISP-->cif_isp10_img_srcs_init 初始化图像源设备(摄像头)-->cif_isp10_pltfrm_get_img_src_device 查找ISP10下cif接口的图像源设备-->phandle = of_get_property(node, "rockchip,camera-modules-attached", &size); //根据该节点内容可知,这里就通过rockchip,camera-modules-attached找到camera4了-->client = of_find_i2c_device_by_node(camera_list_node);-->img_src_array[num_cameras] = cif_isp10_img_src_to_img_src(&client->dev, &(cif_isp10_dev->soc_cfg));-->cif_isp10_img_src_ops[i].ops.to_img_src-->cif_isp10_img_src_v4l2_i2c_subdev_to_img_src //至此核心层就能和摄像头设备驱动绑定了-->i2c_get_clientdata--> v4l2_subdev_call(subdev, core, ioctl, PLTFRM_CIFCAM_ATTACH, (void *)soc_cfg);-->ov_camera_module_ioctl-->ov_camera_module_init-->ov_camera_module_attach-->"custom->check_camera_id(cam_mod)"//将从phandle遍历出来的i2c设备中找到符合条件的client,并将client和当前ISP绑定。-->cif_isp10_v4l2_register_video_device-->vdev->ioctl_ops = ioctl_ops; 使用最后一个参数作为和上层交互的ioctl-->video_register_device 在这里将/dev/videox注册上-->g_cif_isp10_v4l2_dev[g_cif_isp10_v4l2_dev_cnt] =cif_isp10_v4l2_dev; //将设置、注册好的ISP加入核心层中。
引自:(202条消息) rk3399调试ov2659(camera模块@dvp接口)--源码分析_黄进发的博客-CSDN博客_rk3399 v4l2 这个兄弟分析的很透彻
三.实现