第18讲 CRM之Request管理

2024年11月05日 第18讲 CRM之Request管理 极客笔记

本讲是Camera KMD ISP子系统专题的第18讲,我们讲解Camera KMD ISP子系统CRM之Request管理。

更多资源:

资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera
星球ID: 17296815
Wechat 极客笔记圈

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
};

本文链接:http://so.lmcjl.com/news/17100/

展开阅读全文