request有两种,device request和link request。
link request数据原型
struct cam_req_mgr_sched_request_v2 {
__s32 version;
__s32 session_hdl;
__s32 link_hdl;
__s32 bubble_enable;
__s32 sync_mode;
__s32 additional_timeout;
__s32 num_links;
__s32 num_valid_params;
__s64 req_id;
__s32 link_hdls[MAX_LINKS_PER_SESSION];
};
link的结构体定义:
struct cam_req_mgr_core_link {
int32_t link_hdl;
int32_t num_devs;//link中有多少个device
enum cam_pipeline_delay max_delay;
...
struct cam_req_mgr_core_workq *workq;//自定义的workqueue,处理工作队列中work
int32_t pd_mask;
struct cam_req_mgr_connected_device *l_dev;//存放link中device
struct cam_req_mgr_req_data req; //req_data
struct cam_req_mgr_timer *watchdog;//看门狗,监控sof是否超时,sensor是否长时间没有出帧
...
};
其中cam_req_mgr_req_data 定义中有in_q和 req_tbl。
struct cam_req_mgr_req_data {
struct cam_req_mgr_req_queue *in_q; //保存Input request queue
struct cam_req_mgr_req_tbl *l_tbl;//保存request table
int32_t num_tbl;//保存req table的个数
struct cam_req_mgr_apply apply_data[CAM_PIPELINE_DELAY_MAX];//保存apply data,就是req是setting
struct cam_req_mgr_apply prev_apply_data[CAM_PIPELINE_DELAY_MAX];
struct mutex lock;
};
struct cam_req_mgr_req_queue {
int32_t num_slots;//slot个数,最大48个
struct cam_req_mgr_slot slot[MAX_REQ_SLOTS];//slot数组,用slot来存储每帧信息
int32_t rd_idx;//读索引下标。每当收到SOF或EOF,要对req处理时,从rd_idx读取req
int32_t wr_idx;//写索引下标。每当有req从umd通过sche req下发时,就会写入到wr_idx中
int32_t last_applied_idx;//最新位置的读索引下标
};