[RK3288][Android6.0] Camera驱动初始化流程

Platform: RK3288
OS: Android 6.0

Kernel: 3.10.92


Camera驱动框架:

[RK3288][Android6.0] Camera驱动初始化流程_第1张图片


驱动文件说明:

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寄存器数组。

你可能感兴趣的:(子类__Camera)