學習資料來源: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模型初始化流程(主裝置/子裝置)
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