本讲是Camera KMD ISP子系统专题的第9讲,我们讲解Camera KMD ISP子系统CAM SYNC 驱动讲解。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
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
- 收到umd submit的一个request
- 检查输入buffer的sync object,为每个sync object注册回调接cam_context_sync_callback()
- 在回调接口里调用cam_context_appl_req_to_hw()去配置硬件