完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 Camera驱动框架: 驱动文件说明: rk30_camera.c: 设备注册,camera相关dts内容读取。 rk30_camera_oneframe.c: cif控制器驱动。 rk_camera.c: IO操作代码。 soc_camera.c: 标准soc camera接口实现。 v4l2-xxx.c: 标准v4l2实现。 ov2659.c: 设备驱动。 generic_sensor.c/.h: 通用sensor驱动。 调用流程: v4l2-xxx.c -> soc_camera.c -> rk30_camera_oneframe.c -> generic_sensor.c/ov2659.c 驱动注册流程: 设备注册: rk_register_camera_devices -> rk30_camera.c rk_cif_sensor_init -> rk_camera.c //name是rockchip,sensor 和 rockchip,cif platform_driver_register(&rk_cif_driver); -> name是"rockchip,cif"。 rk_dts_cif_probe //从dts中读取cif控制器的资源信息。 platform_driver_register(&rk_sensor_driver); -> name "rockchip,sensor"。 rk_dts_sensor_probe //读取dts中的所有sensor列表信息。 platform_device_register rk30_camera.c //注册名字为“rk312x-camera”的platform device,后面rk30_camera_oneframe.c会和他匹配。 rk_camera_platform_data.sensor_register -> rk_sensor_register -> rk_camera.c platform_device_register //注册platform device, name是“soc-camera-pdrv”, 每一个sensor(在rk_dts_sensor_probe()里从dts中读取过了)注册一次,后面的soc_camera.c会和它匹配。 “soc-camera-pdrv”对应的platform driver. soc_camera_pdrv_probe -> soc_camera.c soc_camera_pdrv_probe -> soc_camera_device_register -> list_add_tail(&icd->list, &devices); //sensor作为子设备添加进soc camera devices列表。 "rk312x-camera"对应的platform drvier: rk_camera_init -> rk30_camera_oneframe.c rk_camera_init_async -> //创建一个线程来异步处理 platform_driver_register -> //name RK29_CAM_DRV_NAME,即rk312x-camera rk_camera_probe -> pcdev->pdata->io_init -> rk_sensor_io_init -> rk_camera.c //sensor_ioctl_cb里面的函数指针赋值 _rk_sensor_io_init_ soc_camera_host_register -> soc_camera.c //注册camera host v4l2_device_register //注册v4l2 device scan_add_host -> soc_camera_probe -> //循环获取上一步已经得到的soc camera devices列表。 soc_camera_power_on -> ssdd->power -> rk_sensor_registerd()里赋值的。 rk_sensor_power -> rk_sensor_pwrseq -> rk_sensor_ioctrl -> sensor_ioctl_cb.sensor_power_cb -> sensor_power_default_cb //使能sensor供电电压(1.8v和2.8v)以及操作power pin. //后面依次是reset,power pin以及clock的操作。 soc_camera_init_i2c //注册sensor的platform device,这里name是ov2659. soc_camera_init_user_formats -> v4l2_subdev_call -> //enum_mbus_fmt generic_sensor_enum_fmt ici->ops->get_formats -> rk_camera_get_formats -> rk30_camera_oneframe.c soc_mbus_get_fmtdesc soc_camera_video_start -> soc_camera_video_start sensor的platform driver注册: 为了统一接口,rk使用了宏定义的方式来注册platform driver, 然后各个sensor driver调用公共的宏定义接口。这里看ov2659的driver. ov2659.c中分别调用了: #if 1 sensor_init_parameters_default_code(); sensor_v4l2_struct_initialization(); sensor_probe_default_code(); sensor_remove_default_code(); #endif sensor_driver_default_module_code(); 这些宏定义都在generic_sensor.h中实现: sensor_driver_default_module_code generic_sensor.h //这个其实就是定义了一个i2c_driver以及init,exit函数。 sensor_mod_init -> i2c_add_driver //这里对应的sensor name是ov2659, 前面有注册过platform device,所以接下来就跑probe函数。 sensor_probe -> v4l2_i2c_subdev_init //注意下ops是sensor_subdev_ops,sensor driver可以自己实现,也可以用generic_sensor.h中给的函数集。 sensor_init_parameters //初始化sensor的各个参数。 sensor_video_probe -> //generic_sensor.h generic_sensor_softreset -> sensor->sensor_cb.sensor_softreset_cb //这里是空函数 generic_sensor_write_array //写ov2659的sensor->info_priv.sensor_SfRstSeqe寄存器数组。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1496 浏览 1 评论
synopsys 的design ware:DW_fpv_div,浮点数除法器,默认32位下,想提升覆盖率(TMAX),如果用功能case去提升覆盖率呢?
1682 浏览 1 评论
RK3588 GStreamer调试四路鱼眼摄像头四宫格显示报错
3963 浏览 1 评论
【飞凌嵌入式OK3576-C开发板体验】RKNN神经网络-YOLO图像识别
254 浏览 0 评论
【飞凌嵌入式OK3576-C开发板体验】SSH远程登录网络配置及CAN通讯
1336 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 14:28 , Processed in 0.590219 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号