Camera KMD ISP学习笔记(4)-CRM
仅用于个人学习,侵联删
V4L2重要结构体:
struct v4l2_device { struct device *dev; // 与 V4L2 设备关联的通用 Linux 设备结构 struct media_device *mdev; // 属于哪个media_device struct v4l2_ctrl_handler *ctrl_handler; // 控制处理器,用于管理 V4L2 控制 struct media_entity entity; // 媒体实体,用于表示 V4L2 设备在媒体拓扑结构中的位置 struct list_head subdevs; // 与 V4L2 设备关联的子设备链表,保存所有的v4l2_subdev struct list_head v4l2_dev_list; // 用于将 V4L2 设备组织成链表的成员 struct mutex lock; // 用于保护对 V4L2 设备结构的访问的互斥锁 const struct v4l2_device_ops *ops; // V4L2 设备操作函数集合指针 void *devnode; // 与设备节点相关联的指针 }; struct video_device { struct media_entity entity; // 用于挂到media_device的entities链表上 struct v4l2_device v4l2_dev; // V4L2 设备结构,video_device 继承自 v4l2_device struct device *parent; // 指向父设备的指针 const struct video_device *next; // 指向下一个视频设备的指针,用于将视频设备链接成链表 int vfl_type; // 视频设备类型 int vfl_dir; // 视频设备方向 int vfl_flags; // 视频设备标志 unsigned int device_caps; // 视频设备的能力标志 unsigned int ioctl_ops; // 视频设备的 ioctl 操作标志 struct mutex ioctl_lock; // 用于保护对视频设备 ioctl 操作的互斥锁 struct video_ioctl2 *ioctl_ops; // 视频设备的 ioctl 操作函数集合指针 const struct v4l2_file_operations *fops; // 视频设备的文件操作函数集合指针 struct list_head fh_list; // 用于管理打开的文件句柄的链表头 struct list_head dev_list; // 用于将视频设备组织成链表的成员 }; struct media_device { /* dev->driver_data points to this struct */ struct device *dev; struct media_devnode *devnode; // 创建设备节点相关的 char model[32]; // 保存的是名字,例如“cam-req-mgr-devnode” struct list_head entities; // 保存了所有的entity }; struct media_entity { struct media_gobj graph_obj; // 用于挂到media_device entites const char *name; // entity的名字 enum media_entity_type obj_type; // MEDIA_ENTITY_TYPE_VIDEO_DEVICE,MEDIA_ENTITY_TYPE_V4L2_SUBDEV u32 function; // CAM_DEVICE_TYPE_BASE,CAM_TFE_DEVICE_TYPR,通过video索引会用到 }; struct media_gobj { struct media_device *mdev; u32 id; struct list_head list; // 用于挂在media_device entities链表 }; struct v4l2_subdev { struct media_entity entity; // 用于挂到media_device的entities链表上 struct v4l2_device *v4l2_dev; // 指向与 V4L2 子设备关联的 V4L2 设备结构的指针 struct v4l2_ctrl_handler ctrl_handler; // 控制处理器,用于管理 V4L2 控制 const struct v4l2_subdev_ops *ops; // V4L2 子设备操作函数集合指针 const struct v4l2_subdev_internal_ops *internal_ops; // V4L2 子设备内部操作函数集合指针 struct v4l2_async_subdev asd; // 异步子设备信息结构体,用于异步操作 struct list_head list; // 用于将 V4L2 子设备组织成链表的成员 struct v4l2_subdev_format format; // V4L2 子设备格式信息结构体 struct mutex lock; // 用于保护对 V4L2 子设备结构的访问的互斥锁 unsigned int flags; // V4L2 子设备的标志,例如V4L2_SUBDEV_FL_HAS_DEVNODE, V4L2_SUBDEV_FL_HAS_EVENTS char name[V4L2_SUBDEV_NAME_SIZE]; // V4L2 子设备的名称 u32 grp_id; // 分组 ID,用于表示 V4L2 子设备所属的分组 struct v4l2_async_notifier notifier; // 异步通知器,用于异步事件通知 };
如cam_sync定义的v4l2_ioctl_ops
static const struct v4l2_ioctl_ops g_cam_sync_ioctl_ops = { .vidioc_subscribe_event = cam_sync_subscribe_event, .vidioc_unsubscribe_event = cam_sync_unsubscribe_event, .vidioc_default = cam_sync_dev_ioctl, };
CRM V4L2驱动模型:
1、CRM V4L2模型初始化流程(主设备/子设备)
2、CRM V4L2驱动模型拓扑图
3、CSL Layer如何使用media entity
伪代码如下:
高通没有用到media的复杂功能
4、CRM V4L2驱动设备节点含义
/dev/video0: crm-req-mgr /dev/v4l-subdev0: cam-cpas /dev/v4l-subdev1: cam-isp /dev/v4l-subdev2: cam-csiphy-driver /dev/v4l-subdev3: cam-csiphy-driver /dev/v4l-subdev4: cam-csiphy-driver /dev/v4l-subdev5: cam-actuator-driver /dev/v4l-subdev6: cam-sensor-driver /dev/v4l-subdev7: cam-sensor-driver /dev/v4l-subdev8: cam-sensor-driver /dev/v4l-subdev9: cam-eeprom /dev/v4l-subdev10: cam-eeprom /dev/v4l-subdev11: cam-flash-dev /dev/v4l-subdev12: cam-ope
header file(entity type): include/uapi/camera/media/cam_req_mgr.h