Camera KMD ISP學習筆記(4)-CRM

lethe1203發表於2024-04-06
學習資料來源:https://deepinout.com/camx-kmd/camera-kmd-isp-subsystem-intro.html
僅用於個人學習,侵聯刪

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

相關文章