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模型初始化流程(主设备/子设备)

0
0

 

2、CRM V4L2驱动模型拓扑图

0

 

3、CSL Layer如何使用media entity

伪代码如下:
0
高通没有用到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
0
 

5、CRM驱动ioctl调用流程

0
0
 

6、子设备驱动ioctl调用流程

0
0
 
 
 
 
posted @ 2024-04-06 01:39  lethe1203  阅读(99)  评论(0编辑  收藏  举报