Camera subdev注册流程

参考资料:
 

Camera驱动模型:

0
用户空间通过CSL协议层,才能访问到Camera subdev,/dev/v4l-subdevx都不是固定的
可以通过cat /sys/class/video4linux/v4l-subdevx/name查询到当前设备各个子设备都具体是啥设备
0
cam_sensor_dev:注册设备,暴露接口
cam_sensor_soc:解析dts,比如clk,regulator等
cam_sensor_core:实际工作流程,打开关闭开流等
 
 static const struct camera_submodule_component camera_sensor[] = {
 #ifdef CONFIG_SPECTRA_SENSOR
         {&cam_res_mgr_init, &cam_res_mgr_exit},    // 入口函数所有子设备都在这里
         {&cam_cci_init_module, &cam_cci_exit_module},
         {&cam_csiphy_init_module, &cam_csiphy_exit_module},
         {&cam_tpg_init_module, &cam_tpg_exit_module},
         {&cam_actuator_driver_init, &cam_actuator_driver_exit},
         {&cam_sensor_driver_init, &cam_sensor_driver_exit},
         {&cam_eeprom_driver_init, &cam_eeprom_driver_exit},
         {&cam_ois_driver_init, &cam_ois_driver_exit},
         {&cam_flash_init_module, &cam_flash_exit_module},
 #endif
 };

platform_driver_register注册平台设备,针对高通的cci总线的
i2c_add_driver注册i2c设备
高通支持挂载到i2c总线,也支持挂载到cci总线
CRM就是video设备,引入component框架
 
struct cam_sensor_ctrl_t整个sensor资源都是存在这个结构体里面
 static int cam_sensor_init_subdev_params(struct cam_sensor_ctrl_t *s_ctrl)
 {
         int rc = 0;

         s_ctrl->v4l2_dev_str.internal_ops = &cam_sensor_internal_ops;
         s_ctrl->v4l2_dev_str.ops = &cam_sensor_subdev_ops;                // subdev操作控制接口
         strscpy(s_ctrl->device_name, CAMX_SENSOR_DEV_NAME, CAM_CTX_DEV_NAME_MAX_LENGTH);
         s_ctrl->v4l2_dev_str.name = s_ctrl->device_name;
         s_ctrl->v4l2_dev_str.sd_flags = (V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS);    // 前面确定是否暴露设备节点给上层,后者表示有没event通知机制
         s_ctrl->v4l2_dev_str.ent_function = CAM_SENSOR_DEVICE_TYPE;        // 查询这个type类型,CSL匹配这个类型确定打开的是哪一个的
         s_ctrl->v4l2_dev_str.token = s_ctrl;
         s_ctrl->v4l2_dev_str.close_seq_prior = CAM_SD_CLOSE_MEDIUM_LOW_PRIORITY;

         rc = cam_register_subdev(&(s_ctrl->v4l2_dev_str));    // 注册子设备
         if (rc)
                 CAM_ERR(CAM_SENSOR, "Fail with cam_register_subdev rc: %d", rc);

         return rc;
 }
回调接口:
 s_ctrl->bridge_intf.device_hdl = -1;
 s_ctrl->bridge_intf.link_hdl = -1;
 s_ctrl->bridge_intf.ops.get_dev_info = cam_sensor_publish_dev_info;    // CRM bridge接口
 s_ctrl->bridge_intf.ops.link_setup = cam_sensor_establish_link;
 s_ctrl->bridge_intf.ops.apply_req = cam_sensor_apply_request;
 s_ctrl->bridge_intf.ops.notify_frame_skip =
         cam_sensor_notify_frame_skip;
 s_ctrl->bridge_intf.ops.flush_req = cam_sensor_flush_request;    // flush
 s_ctrl->bridge_intf.ops.process_evt = cam_sensor_process_evt;    // 消息处理事件接口
流程如下:
0
 
 
 
 
posted @ 2024-03-29 01:45  lethe1203  阅读(67)  评论(0编辑  收藏  举报