---
title: ISP Firmware介绍
description: "ISP Firmware包含三部分，一部分是ISP控制单元和基础算法库，一部分是3A算法库（包括AE、AWB、AF算法库，其中，AF算法库当前不支持），一部分是Sensor库。仅 Atlas 200I/500 A2 推理产品 支持ISP Firmware功能。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/others/ispdevug/ispdevug_0001.html
sourcePath: /source/zh/canncommercial/900/others/ispdevug/ispdevug_0001.html
indexId: 14d2ea17b092688a53b8768c85b5f0f8d50a93e5acbeaa5ce582bad48718405b64
---
# ISP Firmware介绍

#### ISP（Image Signal Processing） Firmware架构

ISP Firmware包含三部分，一部分是ISP控制单元和基础算法库，一部分是3A算法库（包括AE、AWB、AF算法库，其中，AF算法库当前不支持），一部分是Sensor库。仅 Atlas 200I/500 A2 推理产品 支持ISP Firmware功能。

图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使用流程中使用者应保证运行环境稳定，否则可能会导致环境异常。
