下载
中文
注册

ISP Firmware介绍

ISP(Image Signal Processing) Firmware架构

ISP Firmware包含三部分,一部分是ISP控制单元和基础算法库,一部分是3A算法库(包括AE、AWB、AF算法库,其中,AF算法库当前不支持),一部分是Sensor库。

图1 ISP Firmware架构

ISP Firmware设计的基本思想是

  • 单独提供3A算法库,由ISP控制单元调度基础算法库和3A算法库;
  • 同时由业务侧Sensor库分别向ISP基础算法库和3A算法库注册函数回调,以实现差异化的Sensor适配。

    不同的Sensor都以回调函数的形式,向ISP算法库注册控制函数。ISP控制单元调度基础算法库和3A算法库时,将通过这些回调函数获取初始化参数,并控制Sensor, 如调节曝光时间、模拟增益、数字增益等,控制镜头步进聚焦或旋转光圈等。

ISP Firmware内部处理流程分两部分(如图2所示):

  • 一部分是初始化,主要完成ISP控制单元的初始化、ISP基础算法库的初始化、3A算法库的初始化,包括调用Sensor的回调获取Sensor差异化的初始化参数;
  • 另一部分是动态调节,在这个过程中, Firmware中的ISP控制单元调度ISP基础算法库和3A算法库,实时计算并进行相应控制。Firmware的软件结构如图3所示。
图2 ISP Firmware内部处理流程
图3 ISP Firmware软件结构

开发模式

支持用户使用多种开发模式:

  1. 使用昇腾自研的3A算法库。
    这时用户需要根据ISP基础算法库和3A 算法库提供的Sensor适配接口去适配不同的Sensor。建议每款Sensor对应一个文件夹,文件夹中包含两个主要文件,用户可以根据Sensor的Datasheet进行这两个文件的开发,必要的时候可以向Sensor厂家寻求支持:
    • sensor_cmos.c

      主要实现ISP需要的回调函数,这些回调函数中包含了Sensor的适配算法,不同的Sensor可能有所不同。

    • sensor_ctrl.c

      Sensor的底层控制驱动,主要实现Sensor的读写和初始化动作。

  2. 根据ISP提供的3A 算法注册接口,实现自定义的3A算法库开发。

    这时用户需要根据ISP基础算法库和用户的3A算法库给出的Sensor适配接口去适配不同的Sensor。

  3. 部分使用昇腾自研的3A算法库,部分使用自定义的3A算法库。

    例如,AE使用libisp_hiae.a,AWB使用自定义3A算法库。

总体接口调用流程

ISP作为前端采集部分,需要和视频采集单元VI协同工作。ISP初始化和基本配置完成后,需要VI进行接口时序匹配。一是为了匹配不同 Sensor的输入时序,二是为ISP配置正确的输入时序。待时序配置完成后,ISP就可以启动并进行动态图像质量调节。此时输出的图像被VI采集,进而送去显示或编码或AI处理。

图4 ISP firmware 使用流程

代码示例:

/* 启动VI等业务 */

……

hi_s32 ret;
hi_isp_3a_alg_lib ae_lib;
hi_isp_3a_alg_lib awb_lib;
hi_isp_pub_attr pub_attr;
pthread_t isp_pid;
hi_vi_pipe vi_pipe = 0;
/* 注册Sensor库 */
ret = sensor_register_callback(vi_pipe, &ae_lib, &awb_lib);
if (ret != HI_SUCCESS) {
    printf(”register sensor failed !\n”);
    return ret;
}

/* 注册昇腾AE算法库 */
ae_lib.id = 0;
strncpy(ae_lib.lib_name, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME));
ret = hi_mpi_ae_register(isp_dev, &ae_lib);
if (ret != HI_SUCCESS) {
    printf("hi_mpi_ae_register failed with %#x!\n", ret);
    return ret;
}

/* 注册昇腾AWB算法库 */
awb_lib.id = isp_dev;
strncpy(awb_lib.lib_name, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME));

ret = hi_mpi_awb_register(isp_dev, &awb_lib);
if (ret != HI_SUCCESS) {
    printf("hi_mpi_awb_register failed with %#x!\n", ret);
    return ret;
}
/* 初始化ISP外部寄存器 */
ret = hi_mpi_isp_mem_init(vi_pipe);
if (ret != HI_SUCCESS) {
    printf("hi_mpi_isp_mem_init failed with %#x!\n", ret);
    return ret;
}

/* 配置图像公共属性 */
ret = hi_mpi_isp_set_pub_attr(vi_pipe, &pub_attr);
if (ret != HI_SUCCESS) {
    printf("hi_mpi_isp_set_pub_attr failed with %#x!\n", ret);
    return ret;
}
/* 初始化ISP Firmware */
ret = hi_mpi_isp_init(vi_pipe);
if (ret != HI_SUCCESS) {
    printf(”isp init failed !\n”);
    return ret;
}

/* hi_mpi_isp_run单独启动线程运行 */
if (0 != pthread_create(&isp_pid, 0, ISP_Run, NULL)) {
    printf("create isp running thread failed!\n");
    return HI_FAILURE;
}

/* 启动VPSS等业务 */

……

/* 停止VI等业务 */
ret = hi_mpi_isp_exit(vi_pipe);
if (HI_SUCCESS != ret) {
    printf(”isp exit failed !\n”);
    return ret;
}
pthread_join(isp_pid, 0);
return HI_SUCCESS;

AE库有用到标准C库的数学库,请使用者在Makefile中增加 –lm 编译条件。

在ISP firmware 使用流程中使用者应保证运行环境稳定,否则可能会导致环境异常。