46. 开发者指南

46.1. 概述

当图像的最后一个pixel通过后即可取得统计信息, 使用者可通过 CVI_ISP_GetVDTimeOut 以同步获得统计值, 可参考33.1.8的流程。

因为Linux系统user space任务调度不能保证一致的实时性, 需要将驱动配置放在kernel space完成。

ISP提供同步回调接口的注册,可以实现与VD同步。

在本章有相应的接口使用描述, 用户可以将实时性要求较高的任务放在同步回调里面, 底层提供HwIRQ,Workqueue两种方式实现, 可以选择相应的实现方式以确定实时级别。

HwIRQ是指任务放在中断服务中实现,实时性最高, Workqueue的实时性取决于linux系统调用。

46.2. API 参考

46.2.1. isp_sync_task_register

【描述】

向ISP注册同步回调接口

【语法】

int isp_sync_task_register(int vi_pipe, struct isp_sync_task_node *new_node);

【参数】

参数名称

描述

输入/输出

vi_pipe

VI_PIPE 号

输入

new_node

新插入的同步回调节点

输入

【返回值】

返回值

描述

0

成功。

非 0

失败。

【需求】

  • 头文件: cvi_vip_isp_ext.h

  • 库文件:

【注意】

  • 使用前需要确保ISP驱动已加载。

  • 因为ISP同步回调内部实现不保存用户传入的 new_node 指向的实体,所以要求使用 isp_sync_task_node 定义实体时不能为局部变量。

【举例】

无。

【相关主题】

46.2.2. isp_sync_task_unregister

【描述】

向ISP反注册同步回调接口

【语法】

int isp_sync_task_unregister(int vi_pipe, struct isp_sync_task_node *del_node);

【参数】

参数名称

描述

输入/输出

vi_pipe

VI_PIPE 号

输入

del_node

需要删除的同步回调节点

输入

【返回值】

返回值

描述

0

成功。

非 0

失败。

【需求】

  • 头文件: cvi_vip_isp_ext.h

  • 库文件:

【注意】

  • 使用前需要确保ISP驱动已加载。

【举例】

无。

【相关主题】

46.3. 数据类型

46.3.1. isp_sync_tsk_method

【说明】

定义同步回调方法,决定实时性

【定义】

enum isp_sync_tsk_method {
   ISP_SYNC_TSK_METHOD_HW_IRQ = 0,
   ISP_SYNC_TSK_METHOD_WORKQUE,
   ISP_SYNC_TSK_METHOD_BUTT
};

【成员】

成员名称

描述

ISP_SYNC_TSK_METHOD_HW_IRQ

使用硬件中断方式回调。

ISP_SYNC_TSK_METHOD_HW_WORKQUE

使用工作队列方式回调。

【注意事项】

无。

【相关数据类型及接口】

无。

46.3.2. isp_sync_task_node

【说明】

定义同步回调节点信息

【定义】

struct isp_sync_task_node {
   enum isp_sync_tsk_method method;
   __s32 (*isp_sync_tsk_call_back)(__u64 data);
   __u64 data;
   const char *sz_id;
   struct list_head list;
};

【成员】

成员名称

描述

method

回调方式。

isp_sync_tsk_call_back

回调函数,用户注册时传入。

data

回调函数参数,用户注册时传入。

sz_id

节点ID。

list

list节点,用于管理多个回调节点,无需关注。

【举例】

   isp_sync_task_node sync_node = {
   .method = ISP_SYNC_TSK_METHOD_HW_IRQ,
   .isp_sync_tsk_call_back = sync_af_calc,
   .data = 0,
   .sz_id = "hw_0"
};

【注意事项】

无。

【相关数据类型及接口】