本讲是Camera KMD ISP子系统专题的第18讲,我们讲解Camera KMD ISP子系统CRM之Request管理。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
Link Request 和 Device Request
Link Request
针对每个link的请求,比如某一帧是否需要bubble recovery, 或者某一帧需要一个长曝光等feature。
Link可以根据每个link request进行实现。
link request对一个link进行每帧控制。
Link Request数据原型
struct cam_req_mgr_sched_request_v2 {
__s32 session_hdl;// 当前link request属于哪个session
__s32 link_hdl;//当前link request属于哪个link
__s32 bubble_enable;// 当前link request是否需要bubble recovery
__s32 sync_mode;// 当前link request是否需要sync, 多摄场景能用到
__s32 additional_timeout;//当前link request 是否需要额外timeout时间。例如sensor长曝光则需要延长watchdog timeout时间
__s32 num_links;//同步link有几条
__s64 req_id;//当前link request的编号
__s32 link_hdls[MAX_LINKS_PER_SESSION];//保存需要同步的link handles
};
Link in_q(input queue)
struct cam_req_mgr_req_queue {
int32_t num_slots;//request queue有多少个slot
struct cam_req_mgr_slot slot[MAX_REQ_SLOTS];// slot数组
int32_t rd_idx;//读到哪个slot下标了
int32_t wr_idx;//写到哪个slot下标了
int32_t last_applied_idx;//最新applied的slot下标
};
Link in_q slot
struct cam_req_mgr_slot {
int32_t idx;//当前slot索引
int32_t skip_idx;//表示是否忽略当前idx的slot
enum crm_slot_status status;//slot status
int32_t recover;//当前slot是否需要 bubble recovery
int64_t req_id;//当前slot对应的link request id
int32_t sync_mode;//当前slot同步模式,双摄时使用
int32_t additional_timeout;// 当前slot是否需要额外的timeout时间,特俗case时使用例如长曝光
int32_t recovery_counter;//记录当前link已经recovery几次了
int32_t num_sync_links;// 有几个同步Link
int32_t sync_link_hdls[MAXIMUM_LINKS_PER_SESSION - 1];//保存对应的sync link
};
Link in_q slot status
State machine for life cycle of request in input queue
enum crm_slot_status {
CRM_SLOT_STATUS_NO_REQ,
CRM_SLOT_STATUS_REQ_ADDED,
CRM_SLOT_STATUS_REQ_PENDING,
CRM_SLOT_STATUS_REQ_READY,
CRM_SLOT_STATUS_REQ_APPLIED,
CRM_SLOT_STATUS_INVALID,
};
Link in_q图解
Link Request如何从UMD到KMD
case CAM_REQ_MGR_SCHED_REQ: {
cam_req_mgr_schedule_request(&sched_req); // kmd
cam_req_mgr_process_sched_req(link, &task_data);
in_q = link->req.in_q;//取出input request queue
slot = &in_q->slot[in_q->wr_idx];
slot->status = CRM_SLOT_STATUS_REQ_ADDED;
slot->req_id = sched_req->req_id;
slot->skip_idx = 0;
slot->recover = sched_req->bubble_enable;
link->open_req_cnt++;
__cam_req_mgr_inc_idx(&in_q->wr_idx, 1, in_q->num_slots);
Device Request
device request对一个设备进行每帧控制。这里设备包括: isp, sensor, flash等。
Camx node通过packet方式传递request的配置到kmd对应驱动模块,驱动会保存好对应request配置。
设备驱动会通知crm 哪个request从umd已经加入到kmd了。(cam_req_mgr_cb_add_req)。
Request Table
Request Table Slot
Req tbl slot state
State machine for life cycle of request in pd table
enum crm_req_state {
CRM_REQ_STATE_EMPTY,
CRM_REQ_STATE_PENDING,
CRM_REQ_STATE_READY,
CRM_REQ_STATE_INVALID,
};
Req tbl图解
Submit device req umd part
Add device req kmd part
Add Request
cam_req_mgr_cb_add_req(struct cam_req_mgr_add_request *add_req)
struct cam_req_mgr_add_request {
int32_t link_hdl;//属于哪个link
int32_t dev_hdl;//属于哪个device
uint64_t req_id;//request id
uint32_t skip_at_sof;//是否在sof skip apply
uint32_t skip_at_eof;//是否在eof skip apply
uint32_t num_exp;//shdr等特殊feature使用,暂时不介绍
bool trigger_eof;//是否需要在eof trigger apply
};