第9讲 CamSync驱动讲解

2024年11月04日 第9讲 CamSync驱动讲解 极客笔记

本讲是Camera KMD ISP子系统专题的第9讲,我们讲解Camera KMD ISP子系统CAM SYNC 驱动讲解。

更多资源:

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

UMD与KMD接口对应关系

图解sync_object

重要API详细解读

cam_sync_create接口

CAM_SYNC_CREATE

创建一个sync object,在sync_dev->sync_table[2048]中找到一个空的元素,这个空元素下标就是fence id

do {
    idx = find_first_zero_bit(sync_dev->bitmap, CAM_SYNC_MAX_OBJS);
    bit = test_and_set_bit(idx, sync_dev->bitmap);
} while(bit)
cam_sync_init_row(sync_dev->sync_table, idx, name, CAM_SYNC_TYPE_INDV);

cam_sync_handle_register_user_payload接口

CAM_SYNC_REGISTER_PAYLOAD

UMD通过这个接口注册payload到sync object,保存到user_payload_list链表里

memcpy(user_payload_kernel->payload_data, userpayload_info.payload,
 CAM_SYNC_PAYLOAD_WORDS * sizeof(__u64));
list_add_tail(&user_payload_kernel->list, &row->user_payload_list);

cam_sync_merge接口

CAM_SYNC_MERGE

合并多个sync object到一个,在sync_dev->sync_table[]中找到一个空的元素,这个空元素下标就是fence id(merged obj)。

do {
    idx = find_first_zero_bit(sync_dev->bitmap, CAM_SYNC_MAX_OBJS);
    bit = test_and_set_bit(idx, sync_dev->bitmap);
} while(bit)
cam_sync_init_group_object(sync_dev->sync_table, idx, sync_obj, num_objs);
int cam_sync_init_group_object()
{
    struct sync_table_row *row = table + idx;
    //初始化一个新group类型的sync object
    cam_sync_init_row(table, idx, "merged_fence", CAM_SYNC_TYPE_GROUP);
    for (i = 0; i < num_objs; i++) {
        child_row = table + sync_objs[i];
        row->remaining++;//有几个child sync obj
        child_info->sync_id = sync_objs[i];
        list_add_tail(&child_info->list, &row->children_list);
        parent_info->sync_id = idx;
        list_add_tail(&parent_info->list, &child_row->parents_list);
    }
}

图解sync_table

cam_sync_signal接口

CAM_SYNC_SIGNAL/ISP,OPE buffer done主动调用
通知某个fence(sync object)处理完成

row = sync_dev->sync_table + sync_obj;
row->state = status;
//enqueue v4l2 event给umd,进行回调通知DRQ
cam_sync_util_dispatch_signaled_cb(sync_obj, status, event_cause);
//如果是该sync obj被merged,需要通知其parent sync obj
cam_sync_signal_parent_util(status, event_cause, &parents_list);

cam_sync_wait接口

CAM_SYNC_WAIT
同步等待某个fence完成,即某个buffer填充完成sync object被signaled

row = sync_dev->sync_table + sync_obj;
timeleft = cam_common_wait_for_completion_timeout(&row->signaled,
msecs_to_jiffies(timeout_ms));

cam_sync_register_callback接口

对于带input buffer的offline设备(ope)通过sync object trigger其apply req to hw

  1. 收到umd submit的一个request
  2. 检查输入buffer的sync object,为每个sync object注册回调接cam_context_sync_callback()
  3. 在回调接口里调用cam_context_appl_req_to_hw()去配置硬件

演绎camsync如何工作

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

展开阅读全文