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所示。
开发模式
支持用户使用多种开发模式:
总体接口调用流程
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 使用流程中使用者应保证运行环境稳定,否则可能会导致环境异常。