# sample_isp 使用说明

## get_isp_data

### get_isp_data 功能概述

`get_isp_data` 完成 Camera Sensor 、 MIPI CSI 、 SIF 和 ISP 模块的初始化，实现从 ISP 模块获取视频帧数据的功能，支持从 ISP 模块获取 YUV 格式的图像。通过不同的参数命令，可以选择 online 和 offline 模式。

用户可以使用本程序调试验证 MIPI CSI 、 SIF 和 ISP 硬件模块。

#### <span id="get_isp_data_arch"> get_isp_data 软件架构说明

`get_isp_data` 代码中的各个功能模块通过调用 libcam.so 和 libvpf.so 中的函数实现相机的管理和视频流的处理。 camera 模块主要依赖于 libcam.so 提供的相机控制功能，而视频处理模块则依赖于 libvpf.so 提供的视频流处理和节点管理功能。

`get_isp_data` 软件架构如下所示：

![get_sample_isp_software_architecture.png](_static/_images/get_isp_data/get_sample_isp_software_architecture.png)

- `get_isp_data.c` 中的 `main` 函数是程序的入口，它调用 `create_and_run_vflow` 函数来创建和运行视频流，以及调用 `handle_user_command` 函数来处理用户命令。
- `create_and_run_vflow` 函数负责创建视频流中的各个节点，包括相机节点、视频输入节点和图像信号处理节点，以及创建和启动视频流。
- `create_camera_node` 函数用于创建相机节点，该节点与硬件中的相机传感器和 MIPI 主机相关联，通过 `libcam.so` 中的 `camera_node` 实现。
- `create_vin_node` 函数用于创建视频输入节点，该节点与硬件中的视频输入引擎相关联，通过 `libvpf.so` 中的 `vin_node` 实现。
- `create_isp_node` 函数用于创建图像信号处理节点，该节点与硬件中的图像信号处理引擎相关联，通过 `libvpf.so` 中的 `isp_node` 实现。
- `handle_user_command` 函数根据用户输入的命令调用相应的函数来处理，其中 `isp_dump_func` 函数用于获取图像信号处理节点的帧数据并将其写入文件系统中的文件。
- `vflow` 节点表示视频流，它将视频输入节点和图像信号处理节点连接起来，通过 `libvpf.so` 中的相关函数实现。
- 硬件节点包括相机传感器、 MIPI 主机、视频输入引擎和图像信号处理引擎，它们分别与相应的软件节点相关联，共同完成图像数据的采集、传输和处理。

#### get_isp_data 代码位置及目录结构

`get_isp_data` 相关源码路径为 `app/samples/platform_samples/sample_isp/get_isp_data`，代码结构如下：

```shell
── get_isp_data
   ├── get_isp_data.c
   └── Makefile
```

- Makefile：用于编译程序的 Makefile 文件。
- get_isp_data.c：程序的主要源代码文件。

#### get_isp_data 工具位置及目录结构

工具位于板端 `/app/platform_samples/sample_isp/get_isp_data` 目录下：

```shell
root@buildroot:/app/platform_samples/sample_isp/get_isp_data# ls
get_isp_data
```

`get_isp_data` 即为源码编译出来的可执行文件。

#### get_isp_data API 流程说明

`get_isp_data` 的程序流程如下：

![Sample_isp_API_flow_chart_zh_CN.png](_static/_images/get_isp_data_zh_CN/Sample_isp_API_flow_chart_zh_CN.png)

说明：

- **解析命令行参数**：使用 `getopt_long` 函数解析命令行参数。
- **打印帮助信息**：调用 `print_help` 函数显示帮助信息。
- **获取传感器配置**：从 `vp_sensor_config_list` 中获取配置。
- **初始化 MIPI 主机**：调用 `vp_sensor_fixed_mipi_host` 函数进行初始化。
- **打开内存模块**：调用 `hb_mem_module_open` 函数初始化内存管理模块。
- **创建和运行数据流**：调用 `create_and_run_vflow` 函数为每个传感器创建并启动数据流。
- **处理用户命令**：调用 `handle_user_command` 函数进入用户交互模式。
- **停止数据流**：调用 `hbn_vflow_stop` 函数停止数据流。
- **关闭节点和摄像头**：调用 `hbn_vnode_close` 和 `hbn_camera_destroy` 函数释放资源。
- **关闭内存模块**：调用 `hb_mem_module_close` 函数关闭内存管理模块。

### get_isp_data 编译部署

#### get_isp_data 编译

在源码路径下执行 `make` 命令即可完成编译：

```Shell
cd app/samples/platform_samples/sample_isp/get_isp_data
make
```

详细的程序编译方式请查阅 [ 编译方法 ](overview.html#span-id-sample-build) 章节。

#### get_isp_data 硬件环境搭建

开发板上连接 `Camera Sensor` 的方法请查阅 [ 摄像头（ MIPI CSI）](../quick_start/x5_evb_1_b_user_guide.html#span-id-mipi-csi-port-mipi-csi) 章节。

#### get_isp_data 程序部署

编译后的可执行文件一般在 `app/samples/platform_samples/sample_isp/get_isp_data` 目录下：

```shell
├── Makefile
├── get_isp_data
├── get_isp_data.c
└── get_isp_data.o
```

本 sample 的可执行文件位于板端 `/app/platform_samples/sample_isp/get_isp_data` 目录，每次编译完成后，需要把 `get_isp_data` 上传到板端对应目录下，并且运行 `chmod +x get_isp_data` 命令给文件赋予可执行权限后即可使用。

### get_isp_data 运行

#### get_isp_data 程序运行方法

板端进入到 `/app/platform_samples/sample_isp/get_isp_data` 目录，然后直接运行可执行文件即，命令格式如下：

```shell
./get_isp_data <Option> <Sensor_index>
```

示例：

```shell
root@buildroot:~# cd /app/platform_samples/sample_isp/get_isp_data/
root@buildroot:/app/platform_samples/sample_isp/get_isp_data# ./get_isp_data -s 7
```

#### get_isp_data 程序参数选项说明

执行命令 `./get_isp_data -h` 可以获得帮助信息和支持的 Camera Sensor 列表。

```shell
root@buildroot:/app/platform_samples/sample_isp/get_isp_data# ./get_isp_data -h
Usage: get_isp_data [OPTIONS]
Options:
  -s <sensor_index>      Specify sensor index
  -t <settle_value>      Specify settle time for debug
  -m <sensor_mode>       Specify sensor mode of camera_config_t
  -c <channel_type>      Specify channel type:io (isp online), if (isp offline)
  -h                     Show this help message
index: 0  sensor_name: sc1330t                  config_file:linear_1280x960_raw10_30fps_1lane.c
index: 1  sensor_name: irs2875-tof              config_file:linear_208x1413_raw12_15fps_2lane.c
index: 2  sensor_name: sc230ai-10fps            config_file:linear_1920x1080_raw10_10fps_1lane.c
index: 3  sensor_name: sc230ai-30fps            config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 4  sensor_name: sc230ai-dol2-30fps       config_file:dol2_1920x1080_raw10_30fps_2lane.c
index: 5  sensor_name: sc132gs-1280p            config_file:linear_1088x1280_raw10_60fps_1lane.c
index: 6  sensor_name: sc132gs-hdr-2lane        config_file:hdr_1088x1280_raw10_30fps_2lane.c
index: 7  sensor_name: sc035hgs                 config_file:linear_640x480_raw10_30fps_1lane.c
index: 8  sensor_name: sc035hgs_mono            config_file:linear_mono_640x480_raw10_30fps_1lane.c
index: 9  sensor_name: ov5640                   config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 10  sensor_name: f37                     config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 11  sensor_name: imx415-30fps-2lane      config_file:linear_3840x2160_raw10_30fps_2lane.c
index: 12  sensor_name: imx415-30fps-4lane      config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 13  sensor_name: sc202cs-1600x1200       config_file:linear_1600x1200_raw10_30fps_1lane.c
index: 14  sensor_name: irs2381c-tof            config_file:linear_224x1903_raw12_5fps_2lane.c
index: 15  sensor_name: sc035hgs-vc0            config_file:linear_640x480_raw10_30fps_2lane_vc0.c
index: 16  sensor_name: sc035hgs-vc1            config_file:linear_640x480_raw10_30fps_2lane_vc1.c
index: 17  sensor_name: sc231ai-30fps           config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 18  sensor_name: imx586-30fps-4lane      config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 19  sensor_name: os08c10-30fps-2lane     config_file:linear_3840x2160_raw12_30fps_2lane.c
index: 20  sensor_name: ar0233-30fps            config_file:linear_1920x1080_raw12_30fps_2lane.c
index: 21  sensor_name: ar0820std-30fps         config_file:linear_3840x2160_yuv422_30fps_4lane.c
index: 22  sensor_name: sc1336                  config_file:linear_1280x720_raw10_15fps_2lane.c
index: 23  sensor_name: dummy                   config_file:dummy_sensor.c
index: 24  sensor_name: ar0233-30fps            config_file:ar0233_linear_1920x1080_raw12_30fps_2lane_vc0.c
index: 25  sensor_name: ar0233-30fps            config_file:ar0233_linear_1920x1080_raw12_30fps_2lane_vc1.c
index: 26  sensor_name: ov9782-200fps-2lane     config_file:linear_640x360_raw10_200fps_2lane.c
index: 27  sensor_name: ov9782-120fps-2lane     config_file:linear_1280x720_raw10_120fps_2lane.c
index: 28  sensor_name: imx219-640x480-30fps    config_file:linear_640x480_raw10_30fps_2lane.c
index: 29  sensor_name: imx219-1632x1232-30fps  config_file:linear_1632x1232_raw10_30fps_2lane.c
index: 30  sensor_name: imx219-1920x1080-30fps  config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 31  sensor_name: imx219-3264x2464-15fps  config_file:linear_3264x2464_raw10_15fps_2lane.c
index: 32  sensor_name: imx219-3264x2464-21fps  config_file:linear_3264x2464_raw10_21fps_2lane.c
index: 33  sensor_name: ov5647-640x480-60fps    config_file:linear_640x480_raw10_60fps_2lane.c
index: 34  sensor_name: ov5647-1280x960-30fps   config_file:linear_1280x960_raw10_30fps_2lane.c
index: 35  sensor_name: ov5647-1920x1080-30fps  config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 36  sensor_name: ov5647-2592x1944-15fps  config_file:linear_2592x1944_raw10_15fps_2lane.c
index: 37  sensor_name: imx477-1280x960-120fps  config_file:linear_1280x960_raw10_120fps_2lane.c
index: 38  sensor_name: imx477-1920x1080-50fps  config_file:linear_1920x1080_raw12_50fps_2lane.c
index: 39  sensor_name: imx477-2016x1520-40fps  config_file:linear_2016x1520_raw12_40fps_2lane.c
index: 40  sensor_name: imx477-4000x3000-10fps  config_file:linear_4000x3000_raw12_10fps_2lane.c
index: 41  sensor_name: ov50h40-30fps-4lane     config_file:linear_4096x3072_raw10_30fps_4lane.c
index: 42  sensor_name: ox05b1s                 config_file:linear_2592x1944_raw10_30fps_4lane.c
index: 43  sensor_name: ox05b1s_2lane           config_file:linear_2592x1944_raw10_10fps_2lane.c
index: 44  sensor_name: imx415-60fps-4lane      config_file:linear_3840x2160_raw10_60fps_4lane.c
index: 45  sensor_name: sc850sl-30fps           config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 46  sensor_name: shw3g-30fps             config_file:linear_2064x1552_raw12_30fps_4lane.c
```

**命令参数说明：**

- s <sensor_index>: 该选项用于指定要使用的传感器索引。用户需要提供一个有效的索引值。
- t <settle_value>: MIPI dphy 的 settle 时间配置，报 phy 错时可调整，该选项用于指定调试时的稳定时间（ settle time）。
- m <sensor_mode>: 该选项用于指定相机配置中的传感器模式。
- c <channel_type>: 该选项用于指定使用的通道类型，io 代表 isp online 模式，if 代表 isp offline 模式，不加该参数，默认使用 isp offline 模式。
- h: 显示帮助信息。

**当前支持的传感器以及对应的配置文件列表：**

| Index | Sensor Name                | Configuration File                                      |
|-------|----------------------------|---------------------------------------------------------|
| 0     | sc1330t                    | linear_1280x960_raw10_30fps_1lane.c                     |
| 1     | irs2875-tof                | linear_208x1413_raw12_15fps_2lane.c                     |
| 2     | sc230ai-10fps              | linear_1920x1080_raw10_10fps_1lane.c                    |
| 3     | sc230ai-30fps              | linear_1920x1080_raw10_30fps_1lane.c                    |
| 4     | sc230ai-dol2-30fps         | dol2_1920x1080_raw10_30fps_2lane.c                      |
| 5     | sc132gs-1280p              | linear_1088x1280_raw10_30fps_1lane.c                    |
| 6     | sc132gs-hdr-2lane          | hdr_1088x1280_raw10_30fps_2lane.c                       |
| 7     | sc035hgs                   | linear_640x480_raw10_30fps_1lane.c                      |
| 8     | sc035hgs_mono              | linear_mono_640x480_raw10_30fps_1lane.c                 |
| 9     | ov5640                     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 10    | f37                        | linear_1920x1080_raw10_30fps_1lane.c                    |
| 11    | imx415-30fps-2lane         | linear_3840x2160_raw10_30fps_2lane.c                    |
| 12    | imx415-30fps-4lane         | linear_3840x2160_raw10_30fps_4lane.c                    |
| 13    | sc202cs-1600x1200          | linear_1600x1200_raw10_30fps_1lane.c                    |
| 14    | irs2381c-tof               | linear_224x1903_raw12_5fps_2lane.c                      |
| 15    | sc035hgs-vc0               | linear_640x480_raw10_30fps_2lane_vc0.c                  |
| 16    | sc035hgs-vc1               | linear_640x480_raw10_30fps_2lane_vc1.c                  |
| 17    | sc231ai-30fps              | linear_1920x1080_raw10_30fps_2lane.c                    |
| 18    | imx586-30fps-4lane         | linear_3840x2160_raw10_30fps_4lane.c                    |
| 19    | os08c10-30fps-2lane        | linear_3840x2160_raw12_30fps_2lane.c                    |
| 20    | ar0233-30fps               | linear_1920x1080_raw12_30fps_2lane.c                    |
| 21    | ar0820std-30fps            | linear_3840x2160_yuv422_30fps_4lane.c                   |
| 22    | sc1336                     | linear_1280x720_raw10_15fps_2lane.c                     |
| 23    | dummy                      | dummy_sensor.c                                          |
| 24    | ar0233-30fps               | ar0233_linear_1920x1080_raw12_30fps_2lane_vc0.c         |
| 25    | ar0233-30fps               | ar0233_linear_1920x1080_raw12_30fps_2lane_vc1.c         |
| 26    | ov9782-200fps-2lane        | linear_640x360_raw10_200fps_2lane.c                     |
| 27    | ov9782-120fps-2lane        | linear_1280x720_raw10_120fps_2lane.c                    |
| 28    | imx219-640x480-30fps       | linear_640x480_raw10_30fps_2lane.c                      |
| 29    | imx219-1632x1232-30fps     | linear_1632x1232_raw10_30fps_2lane.c                    |
| 30    | imx219-1920x1080-30fps     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 31    | imx219-3264x2464-15fps     | linear_3264x2464_raw10_15fps_2lane.c                    |
| 32    | imx219-3264x2464-21fps     | linear_3264x2464_raw10_21fps_2lane.c                    |
| 33    | ov5647-640x480-60fps       | linear_640x480_raw10_60fps_2lane.c                      |
| 34    | ov5647-1280x960-30fps      | linear_1280x960_raw10_30fps_2lane.c                     |
| 35    | ov5647-1920x1080-30fps     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 36    | ov5647-2592x1944-15fps     | linear_2592x1944_raw10_15fps_2lane.c                    |
| 37    | imx477-1280x960-120fps     | linear_1280x960_raw10_120fps_2lane.c                    |
| 38    | imx477-1920x1080-50fps     | linear_1920x1080_raw12_50fps_2lane.c                    |
| 39    | imx477-2016x1520-40fps     | linear_2016x1520_raw12_40fps_2lane.c                    |
| 40    | imx477-4000x3000-10fps     | linear_4000x3000_raw12_10fps_2lane.c                    |
| 41    | ov50h40-30fps-4lane        | linear_4096x3072_raw10_30fps_4lane.c                    |
| 42    | ox05b1s                    | linear_2592x1944_raw10_30fps_4lane.c                    |
| 43    | ox05b1s_2lane              | linear_2592x1944_raw10_10fps_2lane.c                    |
| 44    | imx415-60fps-4lane         | linear_3840x2160_raw10_60fps_4lane.c                    |
| 45    | sc850sl-30fps              | linear_3840x2160_raw10_30fps_4lane.c                    |
| 46    | shw3g-30fps                | linear_2064x1552_raw12_30fps_4lane.c                    |

#### <span id="get_isp_data_config">get_isp_data 配置文件说明

当前支持的所有传感器都有与之对应的配置文件，在 `app/samples/platform_samples/vp_sensors` 目录中对这些配置文件进行维护。

下面以 f37 的配置文件 `linear_1920x1080_raw10_30fps_1lane.c` 为例，对配置文件进行说明：

```c
// app/samples/platform_samples/vp_sensors/f37/linear_1920x1080_raw10_30fps_1lane.c
#include "vp_sensors.h"

#define SENSOR_WIDTH  1920
#define SENSOR_HEIGHT  1080
#define SENSOE_FPS 30
#define RAW10 0x2B

static mipi_config_t mipi_config = {
	.rx_enable = 1,
	.rx_attr = {
		.phy = 0,
		.lane = 1,
		.datatype = RAW10,
		.fps = SENSOE_FPS,
		.mclk = 24,
		.mipiclk = 864,
		.width = SENSOR_WIDTH,
		.height = SENSOR_HEIGHT,
		.linelenth = 2560,
		.framelenth = 1125,
		.settle = 20,
		.channel_num = 1,
		.channel_sel = {0},
	},
};

static camera_config_t camera_config = {
	.name = "f37",
	.addr = 0x40,
	.sensor_mode = NORMAL_M,
	.fps = SENSOE_FPS,
	.format = RAW10,
	.width = SENSOR_WIDTH,
	.height = SENSOR_HEIGHT,
	.mipi_cfg = &mipi_config,
	.gpio_enable_bit = 0x01,
	.gpio_level_bit = 0x00,
	.calib_lname = "disable",
};

static vin_node_attr_t vin_node_attr = {
	.cim_attr = {
		.mipi_rx = 2,
		.vc_index = 0,
		.ipi_channel = 1,
		.cim_isp_flyby = 1,
		.func = {
			.enable_frame_id = 1,
			.set_init_frame_id = 0,
			.hdr_mode = NOT_HDR,
			.time_stamp_en = 0,
		},

	},
};

static vin_attr_ex_t vin_attr_ex = {
	.vin_attr_ex_mask = 0x80,
	.mclk_ex_attr = {
		.mclk_freq = 24000000,
	},
};

static vin_ichn_attr_t vin_ichn_attr = {
	.width = SENSOR_WIDTH,
	.height = SENSOR_HEIGHT,
	.format = RAW10,
};

static vin_ochn_attr_t vin_ochn_attr = {
	.ddr_en = 1,
	.ochn_attr_type = VIN_BASIC_ATTR,
	.vin_basic_attr = {
		.format = RAW10,
		// 硬件 stride 跟格式匹配，通过行像素根据 raw 数据 bit 位数计算得来
		// 8bit： x1, 10bit: x2 12bit: x2 16bit: x2, 例 raw10 ， 1920 x 2 = 3840
		.wstride = (SENSOR_WIDTH) * 2,
	},
};

static isp_attr_t isp_attr = {
	.input_mode = 1, // 0: online, 1: mcm, 类似 offline
	.sensor_mode= ISP_NORMAL_M,
	.crop = {
		.x = 0,
		.y = 0,
		.h = SENSOR_HEIGHT,
		.w = SENSOR_WIDTH,
	},
};

static isp_ichn_attr_t isp_ichn_attr = {
	.width = SENSOR_WIDTH,
	.height = SENSOR_HEIGHT,
	.fmt = FRM_FMT_RAW,
	.bit_width = 10,
};

static isp_ochn_attr_t isp_ochn_attr = {
	.ddr_en = 1,
	.fmt = FRM_FMT_NV12,
	.bit_width = 8,
};

vp_sensor_config_t f37_linear_1920x1080_raw10_30fps_1lane = {
	.chip_id_reg = 0x0a0b,
	.chip_id = 0x0f37,
	.sensor_name = "f37",
	.config_file = "linear_1920x1080_raw10_30fps_1lane.c",
	.camera_config = &camera_config,
	.vin_ichn_attr = &vin_ichn_attr,
	.vin_node_attr = &vin_node_attr,
	.vin_attr_ex   = &vin_attr_ex,
	.vin_ochn_attr = &vin_ochn_attr,
	.isp_attr      = &isp_attr,
	.isp_ichn_attr = &isp_ichn_attr,
	.isp_ochn_attr = &isp_ochn_attr,
};

```

- **宏定义**

  ```c
  #define SENSOR_WIDTH  1920
  #define SENSOR_HEIGHT  1080
  #define SENSOE_FPS 30
  #define RAW10 0x2B
  ```

  - **SENSOR_WIDTH**: 传感器的宽度设置为 1920 像素。
  - **SENSOR_HEIGHT**: 传感器的高度设置为 1080 像素。
  - **SENSOE_FPS**: 传感器的帧率设置为 30 帧每秒。
  - **RAW10**: 数据格式定义为 RAW10 ，使用十六进制值 0x2B 表示。

- **MIPI 配置**

  ```c
  static mipi_config_t mipi_config = {
  	.rx_enable = 1,
  	.rx_attr = {
  		.phy = 0,
  		.lane = 1,
  		.datatype = RAW10,
  		.fps = SENSOE_FPS,
  		.mclk = 24,
  		.mipiclk = 864,
  		.width = SENSOR_WIDTH,
  		.height = SENSOR_HEIGHT,
  		.linelenth = 2560,
  		.framelenth = 1125,
  		.settle = 20,
  		.channel_num = 1,
  		.channel_sel = {0},
  	},
  };
  ```

  - **rx_enable**: 接收使能，设置为 1 表示启用。
  - **rx_attr**: 包含 MIPI 接口的属性：
    - **phy**: 物理接口设置为 0 。
    - **lane**: 使用 1 条数据通道。
    - **datatype**: 数据类型为 RAW10 。
    - **fps**: 帧率为 30 。
    - **mclk**: 主时钟频率为 24MHz。
    - **mipiclk**: MIPI 时钟频率为 864MHz，每 lane 速率为 mipiclk/lane。
    - **width**: 图像宽度为 1920 。
    - **height**: 图像高度为 1080 。
    - **linelenth**: 行长度为 2560 。
    - **framelenth**: 帧长度为 1125 。
    - **settle**: 设定时间为 20 。
    - **channel_num**: 通道数量为 1 。
    - **channel_sel**: 选择的通道为 0 。

- **相机配置**

  ```c
  static camera_config_t camera_config = {
  	.name = "f37",
  	.addr = 0x40,
  	.sensor_mode = NORMAL_M,
  	.fps = SENSOE_FPS,
  	.format = RAW10,
  	.width = SENSOR_WIDTH,
  	.height = SENSOR_HEIGHT,
  	.mipi_cfg = &mipi_config,
  	.gpio_enable_bit = 0x01,
  	.gpio_level_bit = 0x00,
  	.calib_lname = "disable",
  };
  ```

  - **name**: 相机名称为 "f37"。
  - **addr**: I2C 地址为 0x40 。
  - **sensor_mode**: 传感器模式设置为 NORMAL_M ，当前支持下面几种模式：
    - NORMAL_M = 1 ；
    - DOL2_M = 2 ；
    - DOL3_M = 3 ；
    - DOL4_M = 4 ；
    - PWL_M = 5 ；
    - SLAVE_M = 6 。
  - **fps**: 帧率为 30 帧每秒。
  - **format**: 数据格式为 RAW10 。
  - **mipi_cfg**: 指向 MIPI 配置的指针。
  - **gpio_enable_bit**: GPIO 使能数量为 1 。
  - **gpio_level_bit**: GPIO 电平位为 0x00 。
  - **calib_lname**: sensor 效果库路径，默认路径为 `/usr/hobot/lib/sensor`， 支持自定义路径，总长度不超过 100 字节，设置为 "disable" 时，代码会默认使用 <sensor_name>_tuning.json 文件中的相关属性。

- **VIN 节点属性**

  ```c
  static vin_node_attr_t vin_node_attr = {
  	.cim_attr = {
  		.mipi_rx = 2,
  		.vc_index = 0,
  		.ipi_channel = 1,
  		.cim_isp_flyby = 1,
  		.func = {
  			.enable_frame_id = 1,
  			.set_init_frame_id = 0,
  			.hdr_mode = NOT_HDR,
  			.time_stamp_en = 0,
  		},
  	},
  };
  ```

  - **cim_attr**: 包含 VIN 节点的属性：
    - **mipi_rx**: MIPI 接收通道设置为 2 。
    - **vc_index**: 虚拟通道索引为 0 。
    - **ipi_channel**: IPI 通道设置为 1 。
    - **cim_isp_flyby**: 设置为 1 表示 sif online 到 isp，数据不经过 DDR。
    - **func**: 包含功能设置：
      - **enable_frame_id**: 启用帧 ID。
      - **set_init_frame_id**: 初始化帧 ID 设置为 0 。
      - **hdr_mode**: HDR 模式设置为 NOT_HDR。
      - **time_stamp_en**: 时间戳使能设置为 0 。

- **VIN 扩展属性**

  ```c
  static vin_attr_ex_t vin_attr_ex = {
  	.vin_attr_ex_mask = 0x80,
  	.mclk_ex_attr = {
  		.mclk_freq = 24000000,
  	},
  };
  ```

  - **vin_attr_ex_mask**: 扩展属性掩码设置为 0x80 。
  - **mclk_ex_attr**: 包含主时钟频率的设置，频率为 24MHz。

- **输入通道属性**

  ```c
  static vin_ichn_attr_t vin_ichn_attr = {
  	.width = SENSOR_WIDTH,
  	.height = SENSOR_HEIGHT,
  	.format = RAW10,
  };
  ```

  - **vin_ichn_attr**: 输入通道属性，设置宽度、高度和格式为 RAW10 。

- **输出通道属性**

  ```c
  static vin_ochn_attr_t vin_ochn_attr = {
  	.ddr_en = 1,
  	.ochn_attr_type = VIN_BASIC_ATTR,
  	.vin_basic_attr = {
  		.format = RAW10,
  		.wstride = (SENSOR_WIDTH) * 2,
  	},
  };
  ```

  - **vin_ochn_attr**: 输出通道属性：
    - **ddr_en**: DDR 使能设置为 1 。
    - **ochn_attr_type**: 输出通道属性类型为 VIN_BASIC_ATTR。
    - **vin_basic_attr**: 包含基本属性：
      - **format**: 输出格式为 RAW10 。
      - **wstride**: 宽度步长计算为 1920 * 2 = 3840 （因为 RAW10 格式每个像素占用 2 个字节）。

- **ISP 属性**

  ```c
  static isp_attr_t isp_attr = {
  	.input_mode = 1, // 0: online, 1: mcm, 类似 offline
  	.sensor_mode= ISP_NORMAL_M,
  	.crop = {
  		.x = 0,
  		.y = 0,
  		.h = SENSOR_HEIGHT,
  		.w = SENSOR_WIDTH,
  	},
  };
  ```

  - **input_mode**: sif 输入到 isp 的通路模式，
    - 0 ：表示 sif 直连到 isp（只能支持 1 路）；
    - 1 ：表示 sif 直连到 isp， isp 内部通过 MCM 调度多路（最多支持 4 路）；
    - 2 ：表示 sif 通过 ddr 到 isp。
    - 需要注意的是：
      - `input_mode` 为 0 或者 1 时， `cim_isp_flyby` 必须为 1 ， sif 必须把输出通道 1 绑定到 isp 的输入通道。
      - `input_mode` 为 2 时， `cim_isp_flyby` 必须为 0 ， sif 下 drr 的功能必须打开， sif 必须把输出通道 0 绑定到 isp 的输入通道。
  - **sensor_mode**: ISP 模式设置为 ISP_NORMAL_M ，当前支持下面几种模式：
    - ISP_NORMAL_M = 0 ；
    - ISP_DOL2_M = 1 ；
    - ISP_PWL_M = 2 。
  - **crop**: 对 isp 的输入图像 crop 的参数。裁剪区域的设置，裁剪区域从 (0,0) 开始，宽度和高度与传感器相同。作为 ISP 的输出尺寸使用，为 0 时驱动默认使用输入尺寸作为输出尺寸。原本的输出尺寸暂时无用。

- **ISP 输入和输出通道属性**

  ```c
  static isp_ichn_attr_t isp_ichn_attr = {
  	.width = SENSOR_WIDTH,
  	.height = SENSOR_HEIGHT,
  	.fmt = FRM_FMT_RAW,
  	.bit_width = 10,
  };

  static isp_ochn_attr_t isp_ochn_attr = {
  	.ddr_en = 1,
  	.fmt = FRM_FMT_NV12,
  	.bit_width = 8,
  };
  ```

  - **isp_ichn_attr**: ISP 输入通道属性，设置宽度、高度、格式为 RAW，位宽为 10 。
  - **isp_ochn_attr**: ISP 输出通道属性， DDR 使能设置为 1 ，输出格式为 NV12 ，位宽为 8 。

- **传感器配置结构**

  ```c
  vp_sensor_config_t f37_linear_1920x1080_raw10_30fps_1lane = {
  	.chip_id_reg = 0x0a0b,
  	.chip_id = 0x0f37,
  	.sensor_name = "f37",
  	.config_file = "linear_1920x1080_raw10_30fps_1lane.c",
  	.camera_config = &camera_config,
  	.vin_ichn_attr = &vin_ichn_attr,
  	.vin_node_attr = &vin_node_attr,
  	.vin_attr_ex   = &vin_attr_ex,
  	.vin_ochn_attr = &vin_ochn_attr,
  	.isp_attr      = &isp_attr,
  	.isp_ichn_attr = &isp_ichn_attr,
  	.isp_ochn_attr = &isp_ochn_attr,
  };
  ```

  - **vp_sensor_config_t**: 定义传感器配置结构，包含传感器的各种属性和配置文件信息：
    - **chip_id_reg**: 芯片 ID 寄存器地址为 0x0A0B。
    - **chip_id**: 芯片 ID 为 0x0F37 。
    - **sensor_name**: 传感器名称为 "f37"。
    - **config_file**: 配置文件名为 "linear_1920x1080_raw10_30fps_1lane.c"。
    - 其他属性指向之前定义的配置结构。

#### <span id="get_isp_data_run"> get_isp_data 运行效果

接下来我们可以根据提示选择当前连接在开发板上的 Sensor 类别，然后运行整个系统，后面的演示我们都会以 f37 为例来进行：

```shell
./get_isp_data -s 7
Using index:7  sensor_name:f37  config_file:linear_1920x1080_raw10_30fps_1lane.c
Searching camera sensor on device: /proc/device-tree/soc/cam/vcon@0 i2c bus: 4 mipi rx phy: 0
Searching camera sensor on device: /proc/device-tree/soc/cam/vcon@2 i2c bus: 2 mipi rx phy: 2
INFO: Found sensor_name:f37 on mipi rx csi 2, i2c addr 0x40, config_file:linear_1920x1080_raw10_30fps_1lane.c

***************  Command Lists  ***************
 g      -- get single frame
 l      -- get a set frames
 q      -- quit
 h      -- print help message

Command:
```

- g： 获取一帧图像，支持输入多个 g 来连续获取图像，例如输入 gggg ​

```shell
Command: g
isp dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 0, timestamp: 197145649052
```

- l： 连续获取 12 帧图像，相当于输入 12 个 g ​

```shell
Command: l
isp dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 1, timestamp: 197178981635
isp dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 355, timestamp: 208978985224
... ( 省略，总共 Dump 12 帧 ) ...
isp dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 394, timestamp: 210278982766
isp dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 395, timestamp: 210312316183
```

- q: 退出程序​

```shell
Command: q
quit
```

执行程序后会获取到如 `isp_chn0_1280x960_stride_1280_sframeid_1.yuv` 命名格式的 YUV 图像。

可以使用 Hobot player 工具浏览图像，图像的参数配置说明如下：

- 浏览 YUV 图

按照如下图所示步骤配置选项，其中 file config 里面关注 pic_type 、 yuv_type 、 width 和 height 的配置， sc1330t 配置为（ PIC_YUV,YUV_NV12,1280,960 ）

![vin_hobot_use.png](_static/_images/get_isp_data/isp_hobot_use.png)

### get_isp_data 常见问题

- 硬件接触不良、接口松动导致测试异常
  检查硬件连接状态，确保硬件连接稳定。

----

<span id="multi_isp_vflow"/> </span>
## multi_isp_vflow

### multi_isp_vflow 功能概述

`multi_isp_vflow` 完成 Camera Sensor 、 MIPI CSI 、 SIF 和 ISP 模块的初始化，实现 VIN 获取 Raw 图数据后，**分别发送给两个 ISP 实例进行处理**，达到 Camera Sensor 的一帧图像分别做不同的 ISP 调校。支持从 ISP 模块获取 YUV 格式的图像。

用户可以使用本程序调试打通 MIPI CSI 、 SIF 和 ISP 硬件模块，并且提供一个方法来说明如何单独初始化 ISP 模块。

程序编译方式请查阅 [ 编译方法 ](overview.html#span-id-sample-build) 章节。

开发板上连接 `Camera Sensor` 的方法请查阅 [ 摄像头 （ MIPI CSI）](../quick_start/x5_evb_1_b_user_guide.html#span-id-mipi-csi-port-mipi-csi) 章节。

#### multi_isp_vflow 软件架构说明

`multi_isp_vflow` 通过调用 `libcam.so` 和 `libvpf.so` 中的 API，实现了相机的初始化、图像采集、视频输入、 ISP 处理等功能，构建了一个完整的图像信号处理和视频输入处理的软件架构。其中，`libcam.so` 负责相机设备的驱动和控制，而 `libvpf.so` 提供视频输入和 ISP 处理的核心功能，两者协同工作，实现了图像信号的输入、处理和输出。

`multi_isp_vflow` 软件架构如下所示：

![multi_isp_vflow_software_architecture.png](_static/_images/get_isp_data/multi_isp_vflow_software_architecture.png)

`libcam.so` 作为底层的相机驱动库，提供了相机设备的驱动和控制功能。`multi_isp_vflow` 通过调用 `libcam.so` 的 API，实现了相机的初始化、图像采集和资源释放等操作，使得相机能够与其他模块协同工作，完成图像信号的输入和处理，其中核心函数如下：

- `hbn_camera_create`：用于创建相机节点，初始化相机设备，使其能够进行图像采集。
- `hbn_camera_attach_to_vin`：将相机节点绑定到视频输入节点，建立相机与视频输入之间接，确保相机采集的图像数据能够传输到视频输入节点进行后续处理。
- `hbn_camera_destroy`：用于销毁相机节点，释放相机设备资源，结束相机的图像采集功能。

而 `libvpf.so` 作为底层的视频处理框架库，提供了视频输入和 ISP 处理的核心功能。`multi_isp_vflow`  通过调用 `libvpf.so` 的 API，实现了视频输入节点和 ISP 节点的创建、配置、数据处理和管理等操作，使得视频输入和 ISP 处理能够与其他模块协同工作，完成图像信号的输入、处理和输出，其中核心函数如下：

- `hbn_vnode_open`：用于打开视频输入节点或 ISP 节点，初始化节点设备，使其能够进行数据处理。
- `hbn_vnode_set_attr`、`hbn_vnode_set_ichn_attr`、`hbn_vnode_set_ochn_attr`：用于设置节点的属性、输入通道属性和输出通道属性，配置节点的工作参数，如分辨率、帧率、色彩格式等，以满足不同的处理需求。
- `hbn_vnode_getframe`、`hbn_vnode_releaseframe`：用于从节点获取帧数据和释放帧数据，实现数据的读取和管理。
- `hbn_vflow_create`、`hbn_vflow_add_vnode`、`hbn_vflow_bind_vnode`、`hbn_vflow_start`、`hbn_vflow_stop`、`hbn_vflow_destroy`：用于创建、管理、绑定、启动、停止和销毁数据流（ vflow），实现数据在不同节点之间的传输和处理流程的控制。
- `hbn_isp_get_awb_attr`、`hbn_isp_set_awb_attr`、`hbn_isp_get_exposure_attr`、`hbn_isp_set_exposure_attr`：用于获取和设置 ISP 的自动白平衡（ AWB）和曝光（ AE）属性，实现图像质量的调节和控制。

#### multi_isp_vflow 代码位置及目录结构

`multi_isp_vflow` 相关源码路径为 `/app/samples/platform_samples/sample_isp`，代码结构如下：

```shell
└── multi_isp_vflow
    ├── Makefile
    └── multi_isp_vflow.c
```

- Makefile：用于编译程序的 Makefile 文件。
- multi_isp_vflow.c：程序的主要源代码文件。

#### multi_isp_vflow 工具位置及目录结构

工具位于板端 `/app/platform_samples/sample_isp/multi_isp_vflow` 目录下：

```shell
root@buildroot:/app/platform_samples/sample_isp/multi_isp_vflow# ls
multi_isp_vflow
```

`multi_isp_vflow` 即为源码编译出来的可执行文件。

#### multi_isp_vflow API 流程说明

`get_isp_data` 的程序流程如下：

![multi_isp_vflow_API_flow_chart_zh_CN.png](_static/_images/get_isp_data_zh_CN/multi_isp_vflow_API_flow_chart_zh_CN.png)

说明：

- **解析命令行参数**：使用 `getopt_long()` 函数解析命令行输入。
- **获取传感器配置**：通过 `vp_sensor_config_list[index]` 获取指定索引的传感器配置。
- **初始化 MIPI 主机**：调用 `vp_sensor_fixed_mipi_host()` 函数来初始化 MIPI 主机。
- **创建并运行 VIN-ISP 流**：使用 `create_and_run_vin_isp_vflow(&vin_isp_contex)` 和 `create_and_run_isp_vflow(&isp_contex)` 创建并运行数据流。
- **设置虚拟传感器参数**：通过 `fixed_dummy_sensor_config(&vin_isp_contex, &dummy_sensor_config)` 设置虚拟传感器的相关参数。
- **处理用户命令**：通过 `handle_user_command(vin_isp_contex, isp_contex)` 处理用户输入的命令。
- **停止 VIN 流**：调用 `hbn_vnode_releaseframe()` 释放帧数据。
- **关闭 VIN 和 ISP 节点**：使用 `hbn_vnode_close()` 关闭节点。
- **销毁相机**：调用 `vp_sensor_destroy()` 释放相机资源。
- **打印帮助信息**：如果传感器索引无效，调用 `print_help()` 打印帮助信息。

### multi_isp_vflow 编译部署

#### multi_isp_vflow 编译

在源码路径下执行 `make` 命令即可完成编译：

```Shell
cd app/samples/platform_samples/sample_isp/multi_isp_vflow
make
```

详细的程序编译方式请查阅 [ 编译方法 ](overview.html#span-id-sample-build) 章节。

#### multi_isp_vflow 硬件环境搭建

开发板上连接 `Camera Sensor` 的方法请查阅 [ 摄像头 （ MIPI CSI）](../quick_start/x5_evb_1_b_user_guide.html#span-id-mipi-csi-port-mipi-csi) 章节。

#### multi_isp_vflow 程序部署

编译后的可执行文件一般在 `app/samples/platform_samples/sample_isp/multi_isp_vflow` 目录下：

```shell
├── Makefile
├── multi_isp_vflow
├── multi_isp_vflow.c
└── multi_isp_vflow.o
```

本 sample 的可执行文件位于板端 `/app/platform_samples/sample_isp/multi_isp_vflow` 目录，每次编译完成后，需要把 `multi_isp_vflow` 上传到板端对应目录下，并且运行 `chmod +x multi_isp_vflow` 命令给文件赋予可执行权限后即可使用。

### multi_isp_vflow 运行

#### multi_isp_vflow  程序运行方法

板端进入到 `/app/platform_samples/sample_isp/multi_isp_vflow` 目录，然后直接运行可执行文件即，命令格式如下：

```shell
./multi_isp_vflow <Option> <Sensor_index>
```

示例：

```shell
root@buildroot:~# cd /app/platform_samples/sample_isp/multi_isp_vflow/
root@buildroot:/app/platform_samples/sample_isp/multi_isp_vflow# ./multi_isp_vflow -s 7
```

#### multi_isp_vflow 程序参数选项说明

执行命令 `./multi_isp_vflow -h` 可以获得帮助信息和支持的 Camera Sensor 列表。

```shell
root@buildroot:/app/platform_samples/sample_isp/multi_isp_vflow# ./multi_isp_vflow -h
Usage: multi_isp_vflow [OPTIONS]
Options:
  -s <sensor_index>      Specify sensor index
  -t <settle_value>      Specify settle time for debug
  -m <sensor_mode>       Specify sensor mode of camera_config_t
  -h                     Show this help message
index: 0  sensor_name: sc1330t                  config_file:linear_1280x960_raw10_30fps_1lane.c
index: 1  sensor_name: irs2875-tof              config_file:linear_208x1413_raw12_15fps_2lane.c
index: 2  sensor_name: sc230ai-10fps            config_file:linear_1920x1080_raw10_10fps_1lane.c
index: 3  sensor_name: sc230ai-30fps            config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 4  sensor_name: sc230ai-dol2-30fps       config_file:dol2_1920x1080_raw10_30fps_2lane.c
index: 5  sensor_name: sc132gs-1280p            config_file:linear_1088x1280_raw10_60fps_1lane.c
index: 6  sensor_name: sc132gs-hdr-2lane        config_file:hdr_1088x1280_raw10_30fps_2lane.c
index: 7  sensor_name: sc035hgs                 config_file:linear_640x480_raw10_30fps_1lane.c
index: 8  sensor_name: sc035hgs_mono            config_file:linear_mono_640x480_raw10_30fps_1lane.c
index: 9  sensor_name: ov5640                   config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 10  sensor_name: f37                     config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 11  sensor_name: imx415-30fps-2lane      config_file:linear_3840x2160_raw10_30fps_2lane.c
index: 12  sensor_name: imx415-30fps-4lane      config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 13  sensor_name: sc202cs-1600x1200       config_file:linear_1600x1200_raw10_30fps_1lane.c
index: 14  sensor_name: irs2381c-tof            config_file:linear_224x1903_raw12_5fps_2lane.c
index: 15  sensor_name: sc035hgs-vc0            config_file:linear_640x480_raw10_30fps_2lane_vc0.c
index: 16  sensor_name: sc035hgs-vc1            config_file:linear_640x480_raw10_30fps_2lane_vc1.c
index: 17  sensor_name: sc231ai-30fps           config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 18  sensor_name: imx586-30fps-4lane      config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 19  sensor_name: os08c10-30fps-2lane     config_file:linear_3840x2160_raw12_30fps_2lane.c
index: 20  sensor_name: ar0233-30fps            config_file:linear_1920x1080_raw12_30fps_2lane.c
index: 21  sensor_name: ar0820std-30fps         config_file:linear_3840x2160_yuv422_30fps_4lane.c
index: 22  sensor_name: sc1336                  config_file:linear_1280x720_raw10_15fps_2lane.c
index: 23  sensor_name: dummy                   config_file:dummy_sensor.c
index: 24  sensor_name: ar0233-30fps            config_file:ar0233_linear_1920x1080_raw12_30fps_2lane_vc0.c
index: 25  sensor_name: ar0233-30fps            config_file:ar0233_linear_1920x1080_raw12_30fps_2lane_vc1.c
index: 26  sensor_name: ov9782-200fps-2lane     config_file:linear_640x360_raw10_200fps_2lane.c
index: 27  sensor_name: ov9782-120fps-2lane     config_file:linear_1280x720_raw10_120fps_2lane.c
index: 28  sensor_name: imx219-640x480-30fps    config_file:linear_640x480_raw10_30fps_2lane.c
index: 29  sensor_name: imx219-1632x1232-30fps  config_file:linear_1632x1232_raw10_30fps_2lane.c
index: 30  sensor_name: imx219-1920x1080-30fps  config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 31  sensor_name: imx219-3264x2464-15fps  config_file:linear_3264x2464_raw10_15fps_2lane.c
index: 32  sensor_name: imx219-3264x2464-21fps  config_file:linear_3264x2464_raw10_21fps_2lane.c
index: 33  sensor_name: ov5647-640x480-60fps    config_file:linear_640x480_raw10_60fps_2lane.c
index: 34  sensor_name: ov5647-1280x960-30fps   config_file:linear_1280x960_raw10_30fps_2lane.c
index: 35  sensor_name: ov5647-1920x1080-30fps  config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 36  sensor_name: ov5647-2592x1944-15fps  config_file:linear_2592x1944_raw10_15fps_2lane.c
index: 37  sensor_name: imx477-1280x960-120fps  config_file:linear_1280x960_raw10_120fps_2lane.c
index: 38  sensor_name: imx477-1920x1080-50fps  config_file:linear_1920x1080_raw12_50fps_2lane.c
index: 39  sensor_name: imx477-2016x1520-40fps  config_file:linear_2016x1520_raw12_40fps_2lane.c
index: 40  sensor_name: imx477-4000x3000-10fps  config_file:linear_4000x3000_raw12_10fps_2lane.c
index: 41  sensor_name: ov50h40-30fps-4lane     config_file:linear_4096x3072_raw10_30fps_4lane.c
index: 42  sensor_name: ox05b1s                 config_file:linear_2592x1944_raw10_30fps_4lane.c
index: 43  sensor_name: ox05b1s_2lane           config_file:linear_2592x1944_raw10_10fps_2lane.c
index: 44  sensor_name: imx415-60fps-4lane      config_file:linear_3840x2160_raw10_60fps_4lane.c
index: 45  sensor_name: sc850sl-30fps           config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 46  sensor_name: shw3g-30fps             config_file:linear_2064x1552_raw12_30fps_4lane.c

```

**命令参数说明：**

- s <sensor_index>: 该选项用于指定要使用的传感器索引。用户需要提供一个有效的索引值。
- t <settle_value>: MIPI dphy 的 settle 时间配置，报 phy 错时可调整，该选项用于指定调试时的稳定时间（ settle time）。
- m <sensor_mode>: 该选项用于指定相机配置中的传感器模式。
- h: 显示帮助信息。

**当前支持的传感器以及对应的配置文件列表：**

| Index | Sensor Name                | Configuration File                                      |
|-------|----------------------------|---------------------------------------------------------|
| 0     | sc1330t                    | linear_1280x960_raw10_30fps_1lane.c                     |
| 1     | irs2875-tof                | linear_208x1413_raw12_15fps_2lane.c                     |
| 2     | sc230ai-10fps              | linear_1920x1080_raw10_10fps_1lane.c                    |
| 3     | sc230ai-30fps              | linear_1920x1080_raw10_30fps_1lane.c                    |
| 4     | sc230ai-dol2-30fps         | dol2_1920x1080_raw10_30fps_2lane.c                      |
| 5     | sc132gs-1280p              | linear_1088x1280_raw10_30fps_1lane.c                    |
| 6     | sc132gs-hdr-2lane          | hdr_1088x1280_raw10_30fps_2lane.c                       |
| 7     | sc035hgs                   | linear_640x480_raw10_30fps_1lane.c                      |
| 8     | sc035hgs_mono              | linear_mono_640x480_raw10_30fps_1lane.c                 |
| 9     | ov5640                     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 10    | f37                        | linear_1920x1080_raw10_30fps_1lane.c                    |
| 11    | imx415-30fps-2lane         | linear_3840x2160_raw10_30fps_2lane.c                    |
| 12    | imx415-30fps-4lane         | linear_3840x2160_raw10_30fps_4lane.c                    |
| 13    | sc202cs-1600x1200          | linear_1600x1200_raw10_30fps_1lane.c                    |
| 14    | irs2381c-tof               | linear_224x1903_raw12_5fps_2lane.c                      |
| 15    | sc035hgs-vc0               | linear_640x480_raw10_30fps_2lane_vc0.c                  |
| 16    | sc035hgs-vc1               | linear_640x480_raw10_30fps_2lane_vc1.c                  |
| 17    | sc231ai-30fps              | linear_1920x1080_raw10_30fps_2lane.c                    |
| 18    | imx586-30fps-4lane         | linear_3840x2160_raw10_30fps_4lane.c                    |
| 19    | os08c10-30fps-2lane        | linear_3840x2160_raw12_30fps_2lane.c                    |
| 20    | ar0233-30fps               | linear_1920x1080_raw12_30fps_2lane.c                    |
| 21    | ar0820std-30fps            | linear_3840x2160_yuv422_30fps_4lane.c                   |
| 22    | sc1336                     | linear_1280x720_raw10_15fps_2lane.c                     |
| 23    | dummy                      | dummy_sensor.c                                          |
| 24    | ar0233-30fps               | ar0233_linear_1920x1080_raw12_30fps_2lane_vc0.c         |
| 25    | ar0233-30fps               | ar0233_linear_1920x1080_raw12_30fps_2lane_vc1.c         |
| 26    | ov9782-200fps-2lane        | linear_640x360_raw10_200fps_2lane.c                     |
| 27    | ov9782-120fps-2lane        | linear_1280x720_raw10_120fps_2lane.c                    |
| 28    | imx219-640x480-30fps       | linear_640x480_raw10_30fps_2lane.c                      |
| 29    | imx219-1632x1232-30fps     | linear_1632x1232_raw10_30fps_2lane.c                    |
| 30    | imx219-1920x1080-30fps     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 31    | imx219-3264x2464-15fps     | linear_3264x2464_raw10_15fps_2lane.c                    |
| 32    | imx219-3264x2464-21fps     | linear_3264x2464_raw10_21fps_2lane.c                    |
| 33    | ov5647-640x480-60fps       | linear_640x480_raw10_60fps_2lane.c                      |
| 34    | ov5647-1280x960-30fps      | linear_1280x960_raw10_30fps_2lane.c                     |
| 35    | ov5647-1920x1080-30fps     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 36    | ov5647-2592x1944-15fps     | linear_2592x1944_raw10_15fps_2lane.c                    |
| 37    | imx477-1280x960-120fps     | linear_1280x960_raw10_120fps_2lane.c                    |
| 38    | imx477-1920x1080-50fps     | linear_1920x1080_raw12_50fps_2lane.c                    |
| 39    | imx477-2016x1520-40fps     | linear_2016x1520_raw12_40fps_2lane.c                    |
| 40    | imx477-4000x3000-10fps     | linear_4000x3000_raw12_10fps_2lane.c                    |
| 41    | ov50h40-30fps-4lane        | linear_4096x3072_raw10_30fps_4lane.c                    |
| 42    | ox05b1s                    | linear_2592x1944_raw10_30fps_4lane.c                    |
| 43    | ox05b1s_2lane              | linear_2592x1944_raw10_10fps_2lane.c                    |
| 44    | imx415-60fps-4lane         | linear_3840x2160_raw10_60fps_4lane.c                    |
| 45    | sc850sl-30fps              | linear_3840x2160_raw10_30fps_4lane.c                    |
| 46    | shw3g-30fps                | linear_2064x1552_raw12_30fps_4lane.c                    |

#### multi_isp_vflow 配置文件说明

当前支持的所有传感器都有与之对应的配置文件，在 `app/samples/platform_samples/vp_sensors` 目录中对这些配置文件进行维护。

相关说明参考本文中 [get_isp_data 配置文件说明 ](./sample_isp.html#span-id-get-isp-data-config-get-isp-data) 章节相关内容。

#### multi_isp_vflow 运行效果

接下来我们可以根据提示选择当前连接在开发板上的 Sensor 类别，然后运行整个系统，后面的演示我们都会以 sc230ai 为例来进行：

```
./multi_isp_vflow -s 3
Using index:3  sensor_name:sc230ai-30fps  config_file:linear_1920x1080_raw10_30fps_1lane.c
... ( 省略无关日志 ) ...
Searching camera sensor on device: /proc/device-tree/soc/cam/vcon@3 i2c bus: 7 mipi rx phy: 3
INFO: Found sensor_name:sc230ai-30fps on mipi rx csi 3, i2c addr 0x30, config_file:linear_1920x1080_raw10_30fps_1lane.c
[INFO] Create isp node handle: 165733
[INFO] Create isp node handle: 296805

***************  Command Lists  ***************
 g      -- get single frame
 l      -- get a set frames
 e      -- get a set frames and backfill ae, awb
 q      -- quit
 h      -- print help message

Command:
```

**命令解释：**

- g： 获取一帧图像（ Raw），并把该 Raw 图分别送给两个 ISP 实例处理，并且保存处理后的 YUV 图像（保存图像不管是写内存还是写磁盘都会很影响性能），最终两个 ISP 会分别生成一张 YUV 格式的图像文件。

  支持输入多个 g 来连续获取图像，例如输入 gggg，这样最终两个 ISP 会分别生成 4 张 YUV 格式的图像文件。 ​

```shell
Command: g
vin dump raw 1920x1080(stride:3840), buffer size: 4147200 frame id: 1, timestamp: 8831341125627
isp(165733) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 1, timestamp: 8831341125627
isp(296805) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 1, timestamp: 8831341125627
```

- l： 连续获取 12 帧图像，相当于输入 12 个 g，最终两个 ISP 会分别生成 12 张 YUV 格式的图像文件。 ​

```shell
Command: l
vin dump raw 1920x1080(stride:3840), buffer size: 4147200 frame id: 5326, timestamp: 9008841124337
isp(165733) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 5326, timestamp: 9008841124337
isp(296805) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 5326, timestamp: 9008841124337
vin dump raw 1920x1080(stride:3840), buffer size: 4147200 frame id: 5327, timestamp: 9008874457587
isp(165733) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 5327, timestamp: 9008874457587
isp(296805) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 5327, timestamp: 9008874457587
... ( 省略，总共 Dump 12 帧 ) ...
vin dump raw 1920x1080(stride:3840), buffer size: 4147200 frame id: 5426, timestamp: 9012174457588
isp(165733) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 5426, timestamp: 9012174457588
isp(296805) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 5426, timestamp: 9012174457588
```

- e： 连续 12 帧获取主通路 ISP 的 2A（AE 和 AWB）回灌给从通路，dump 主从路图像和 2A 信息，最终两个 ISP 会分别生成 12 张 YUV 格式的图像文件。 ​

```shell
Command: e
(dump_awb_attr)handle 100197 awb: version 0 mode 0manual_attr: gain: rgain: 2.271484grgain: 1.067383gbgain: 1.067383bgain: 1.876953
(dump_exp_attr)handle 100197 exp: version 0 mode 0manual_attr: gain: exp_time: 2.271484again: 0.009985
dgain: 2.650473ispgain: 1.000000ae_exp: 1.000000cur_lux 1108738304
isp(100197) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 1, timestamp: 59184108316179
>>> awb backfill...
>>> ae backfill...
vin dump raw 1920x1080(stride:3840), buffer size: 4147200 frame id: 76, timestamp: 59186608321055
(dump_awb_attr)handle 231269 awb: version 0 mode 1manual_attr: gain: rgain: 2.271484grgain: 1.067383gbgain: 1.067383bgain: 1.876953
(dump_exp_attr)handle 231269 exp: version 0 mode 1manual_attr: gain: exp_time: 2.271484again: 0.009985
dgain: 2.650473ispgain: 1.000000ae_exp: 1.000000cur_lux 0
isp(231269) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 76, timestamp: 59186608321055
... ( 省略，总共 Dump 12 帧 ) ...
```

- q: 退出程序​

```shell
Command: q
quit
```

**注意：** multi_isp_vflow 目前只支持 sc230ai 模组，其他模组需修改 dummy sensor 库适配

程序运行启动，并且执行 g 或者 l 后，会在当前目录保存如下命名格式的 yuv 图像：

```shell
isp_handle_165733_chn0_1920x1080_stride_1920_frameid_1860_ts_8893307792615.yuv
```

字段说明：

- **isp_handle**： ISP 实例的 handle 号，用于区分不同 ISP 实例。
  - 示例：`165733`

- **chn**： ISP 通道号， ISP 的值都是 `0`。

- **1920x1080_stride_1920**：图像分辨率（宽度 x 高度）和对齐后的宽度。
  - 示例：`1920x1080_stride_1920`

- **frameid**：帧 ID，表示图像帧的唯一标识。
  - 示例：`1860`

- **ts**：时间戳，表示捕捉图像的时间，单位：纳秒。
  - 示例：`8893307792615`

**注意：** frameid 和 ts 需要使能 Camera Sensor 配置中的以下参数才会有效：

在 vp_sensors 目录下的 Camera Sensor 配置文件中定义：

```shell
static vin_node_attr_t sc230ai_vin_node_attr = {
	.cim_attr = {
		... ...
		.func = {
			.enable_frame_id = 1,   # 使能 frameid
			.set_init_frame_id = 0,
			.hdr_mode = NOT_HDR,
			.time_stamp_en = 0,     # 使能 ts, 如果 enable_frame_id 为 1 ， ts 会自动使能
		},
	},
```

### multi_isp_vflow 常见问题

- multi_isp_vflow 目前只支持 sc230ai 模组，其他模组需修改 dummy sensor 库适配。

<span id="isp_feedback"/> </span>

## isp_feedback

### isp_feedback 功能概述

- `isp_feedback` 通过虚拟 Camera Sensor 初始化 MIPI CSI、SIF 和 ISP 模块，读取 RAW 图像数据，并回灌至 ISP 进行调校后生成 YUV 图像。
- `isp_feedback` 调校时，会应用指定 Camera Sensor 的参数，并使用对应的 ISP 效果库。

- 程序编译方式请查阅 [ 编译方法 ](overview.html#span-id-sample-build) 章节。

#### isp_feedback 软件架构说明

`isp_feedback` 通过调用 `libcam.so` 和 `libvpf.so` 中的 API，实现了虚拟  Camera Sensor 的初始化、图像采集、视频输入、 ISP 处理等功能，构建了一个完整的图像信号处理和视频输入处理的软件架构。

- `libcam.so`：负责虚拟 Camera Sensor 设备的驱动和控制。
- `libvpf.so`：提供视频输入和 ISP 处理的核心功能。

![image-20250211-170930.png](_static/_images/get_isp_data/isp_feedback/image-20250211-170930.png)

#### 主要 API 说明

- `hbn_camera_create`：创建虚拟 Camera Sensor 节点，初始化 Camera Sensor 设备。
- `hbn_camera_attach_to_vin`：绑定虚拟 Camera Sensor 到视频输入节点，实现数据传输。
- `hbn_camera_destroy`：销毁虚拟 Camera Sensor 节点，释放设备资源。
- `hbn_vnode_open`：用于打开视频输入节点或 ISP 节点，初始化节点设备，使其能够进行数据处理。
- `hbn_vnode_set_attr`、`hbn_vnode_set_ichn_attr`、`hbn_vnode_set_ochn_attr`：用于设置节点的属性、输入通道属性和输出通道属性，配置节点的工作参数，如分辨率、帧率、色彩格式等，以满足不同的处理需求。
- `hbn_vnode_getframe`、`hbn_vnode_releaseframe`：用于从节点获取帧数据和释放帧数据，实现数据的读取和管理。
- `hbn_vflow_create`、`hbn_vflow_add_vnode`、`hbn_vflow_start`、`hbn_vflow_stop`、`hbn_vflow_destroy`：用于创建、管理、绑定、启动、停止和销毁数据流（ vflow），实现数据在不同节点之间的传输和处理流程的控制。
- `hbn_isp_get_awb_attr`、`hbn_isp_set_awb_attr`、`hbn_isp_get_exposure_attr`、`hbn_isp_set_exposure_attr`：用于获取和设置 ISP 的自动白平衡（ AWB）和曝光（ AE）属性，实现图像质量的调节和控制。

#### isp_feedback 代码位置及目录结构

`isp_feedback` 相关源码路径为 `/app/samples/platform_samples/sample_isp`，代码结构如下：

```shell
└── isp_feedback
    ├── Makefile
    └── isp_feedback.c
```

- Makefile：用于编译程序的 Makefile 文件。
- isp_feedback.c：程序的主要源代码文件。

#### isp_feedback 工具位置及目录结构

工具位于板端 `/app/platform_samples/sample_isp/isp_feedback` 目录下：

```shell
root@buildroot:/app/platform_samples/sample_isp/isp_feedback# ls
isp_feedback
```

#### isp_feedback API 流程说明

![image-20250211-165359.png](_static/_images/get_isp_data/isp_feedback/image-20250211-165359.png)

说明：

- **解析命令行参数**：使用 `getopt_long()` 函数解析命令行输入。
- **获取传感器配置**：通过 `vp_sensor_config_list[index]` 获取指定索引的传感器配置。
- **创建并运行 VIN-ISP 流**：使用 `create_and_run_isp_vflow(&isp_contex)` 创建并运行数据流。
- **设置虚拟传感器参数**：通过 `fixed_dummy_sensor_config(&vin_isp_contex, &dummy_sensor_config)` 设置虚拟传感器的相关参数。
- **停止 VIN 流**：调用 `hbn_vnode_releaseframe()` 释放帧数据。
- **关闭 VIN 和 ISP 节点**：使用 `hbn_vnode_close()` 关闭节点。
- **销毁Camera Sensor**：调用 `vp_sensor_destroy()` 释放 Camera Sensor 资源。
- **打印帮助信息**：如果传感器索引无效，调用 `print_help()` 打印帮助信息。

### isp_feedback 编译部署

#### isp_feedback 编译

- 进入 sample_isp/isp_feedback 目录，执行 `make` 编译。
- 输出产物是 sample_isp 源码目录下的 `isp_feedback`。
- 详细程序编译方式请查阅 [编译方法](overview.html#span-id-sample-build) 章节。
在源码路径下执行 `make` 命令即可完成编译：

#### isp_feedback 硬件环境搭建

开发板上连接 `Camera Sensor` 的方法请查阅 [摄像头 （ MIPI CSI）](../quick_start/x5_evb_1_b_user_guide.html#span-id-mipi-csi-port-mipi-csi) 章节。

#### isp_feedback 程序部署

编译后的可执行文件一般在 `app/samples/platform_samples/sample_isp/isp_feedback` 目录下：

```shell
├── Makefile
├── isp_feedback
├── isp_feedback.c
```

刷写系统软件镜像后 , 本 sample 的可执行文件位于板端 : `/app/platform_samples/sample_isp/isp_feedback`。

### isp_feedback 运行

#### isp_feedback  程序运行方法

- 直接执行程序 `./isp_feedback -h` 可以获得帮助信息：

#### isp_feedback 程序参数选项说明

```shell
Usage: isp_feedback [OPTIONS]
Options:
  -s <sensor_index>      Specify sensor index
  -f <file>              Specify Raw filename
  -t <settle_value>      Specify settle time for debug
  -m <sensor_mode>       Specify sensor mode of camera_config_t
  -h                     Show this help message
index: 0  sensor_name: sc1330t                  config_file:linear_1280x960_raw10_30fps_1lane.c
index: 1  sensor_name: irs2875-tof              config_file:linear_208x1413_raw12_15fps_2lane.c
index: 2  sensor_name: sc230ai-10fps            config_file:linear_1920x1080_raw10_10fps_1lane.c
index: 3  sensor_name: sc230ai-30fps            config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 4  sensor_name: sc230ai-dol2-30fps       config_file:dol2_1920x1080_raw10_30fps_2lane.c
index: 5  sensor_name: sc132gs-1280p            config_file:linear_1088x1280_raw10_60fps_1lane.c
index: 6  sensor_name: sc132gs-hdr-2lane        config_file:hdr_1088x1280_raw10_30fps_2lane.c
index: 7  sensor_name: sc035hgs                 config_file:linear_640x480_raw10_30fps_1lane.c
index: 8  sensor_name: sc035hgs_mono            config_file:linear_mono_640x480_raw10_30fps_1lane.c
index: 9  sensor_name: ov5640                   config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 10  sensor_name: f37                     config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 11  sensor_name: imx415-30fps-2lane      config_file:linear_3840x2160_raw10_30fps_2lane.c
index: 12  sensor_name: imx415-30fps-4lane      config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 13  sensor_name: sc202cs-1600x1200       config_file:linear_1600x1200_raw10_30fps_1lane.c
index: 14  sensor_name: irs2381c-tof            config_file:linear_224x1903_raw12_5fps_2lane.c
index: 15  sensor_name: sc035hgs-vc0            config_file:linear_640x480_raw10_30fps_2lane_vc0.c
index: 16  sensor_name: sc035hgs-vc1            config_file:linear_640x480_raw10_30fps_2lane_vc1.c
index: 17  sensor_name: sc231ai-30fps           config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 18  sensor_name: imx586-30fps-4lane      config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 19  sensor_name: os08c10-30fps-2lane     config_file:linear_3840x2160_raw12_30fps_2lane.c
index: 20  sensor_name: ar0233-30fps            config_file:linear_1920x1080_raw12_30fps_2lane.c
index: 21  sensor_name: ar0820std-30fps         config_file:linear_3840x2160_yuv422_30fps_4lane.c
index: 22  sensor_name: sc1336                  config_file:linear_1280x720_raw10_15fps_2lane.c
index: 23  sensor_name: dummy                   config_file:dummy_sensor.c
index: 24  sensor_name: ar0233-30fps            config_file:ar0233_linear_1920x1080_raw12_30fps_2lane_vc0.c
index: 25  sensor_name: ar0233-30fps            config_file:ar0233_linear_1920x1080_raw12_30fps_2lane_vc1.c
index: 26  sensor_name: ov9782-200fps-2lane     config_file:linear_640x360_raw10_200fps_2lane.c
index: 27  sensor_name: ov9782-120fps-2lane     config_file:linear_1280x720_raw10_120fps_2lane.c
index: 28  sensor_name: imx219-640x480-30fps    config_file:linear_640x480_raw10_30fps_2lane.c
index: 29  sensor_name: imx219-1632x1232-30fps  config_file:linear_1632x1232_raw10_30fps_2lane.c
index: 30  sensor_name: imx219-1920x1080-30fps  config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 31  sensor_name: imx219-3264x2464-15fps  config_file:linear_3264x2464_raw10_15fps_2lane.c
index: 32  sensor_name: imx219-3264x2464-21fps  config_file:linear_3264x2464_raw10_21fps_2lane.c
index: 33  sensor_name: ov5647-640x480-60fps    config_file:linear_640x480_raw10_60fps_2lane.c
index: 34  sensor_name: ov5647-1280x960-30fps   config_file:linear_1280x960_raw10_30fps_2lane.c
index: 35  sensor_name: ov5647-1920x1080-30fps  config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 36  sensor_name: ov5647-2592x1944-15fps  config_file:linear_2592x1944_raw10_15fps_2lane.c
index: 37  sensor_name: imx477-1280x960-120fps  config_file:linear_1280x960_raw10_120fps_2lane.c
index: 38  sensor_name: imx477-1920x1080-50fps  config_file:linear_1920x1080_raw12_50fps_2lane.c
index: 39  sensor_name: imx477-2016x1520-40fps  config_file:linear_2016x1520_raw12_40fps_2lane.c
index: 40  sensor_name: imx477-4000x3000-10fps  config_file:linear_4000x3000_raw12_10fps_2lane.c
index: 41  sensor_name: ov50h40-30fps-4lane     config_file:linear_4096x3072_raw10_30fps_4lane.c
index: 42  sensor_name: ox05b1s                 config_file:linear_2592x1944_raw10_30fps_4lane.c
index: 43  sensor_name: ox05b1s_2lane           config_file:linear_2592x1944_raw10_10fps_2lane.c
index: 44  sensor_name: imx415-60fps-4lane      config_file:linear_3840x2160_raw10_60fps_4lane.c
index: 45  sensor_name: sc850sl-30fps           config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 46  sensor_name: shw3g-30fps             config_file:linear_2064x1552_raw12_30fps_4lane.c
```

**命令参数说明：**

- s <sensor_index>: 该选项用于指定要使用的 Camera Sensor 对应的效果库，使用时不需要接入实际的Camera。
- f <file>: 该选项用于指定要使用 Raw 图的文件名。
- t <settle_value>: MIPI dphy 的 settle 时间配置，虚拟  Camera Sensor 可以不用关心。
- m <sensor_mode>: 该选项用于指定相机配置中的传感器模式，虚拟  Camera Sensor 可以不用关心。
- h: 显示帮助信息。

**当前支持的传感器以及对应的配置文件列表：**

| Index | Sensor Name                | Configuration File                                      |
|-------|----------------------------|---------------------------------------------------------|
| 0     | sc1330t                    | linear_1280x960_raw10_30fps_1lane.c                     |
| 1     | irs2875-tof                | linear_208x1413_raw12_15fps_2lane.c                     |
| 2     | sc230ai-10fps              | linear_1920x1080_raw10_10fps_1lane.c                    |
| 3     | sc230ai-30fps              | linear_1920x1080_raw10_30fps_1lane.c                    |
| 4     | sc230ai-dol2-30fps         | dol2_1920x1080_raw10_30fps_2lane.c                      |
| 5     | sc132gs-1280p              | linear_1088x1280_raw10_30fps_1lane.c                    |
| 6     | sc132gs-hdr-2lane          | hdr_1088x1280_raw10_30fps_2lane.c                       |
| 7     | sc035hgs                   | linear_640x480_raw10_30fps_1lane.c                      |
| 8     | sc035hgs_mono              | linear_mono_640x480_raw10_30fps_1lane.c                 |
| 9     | ov5640                     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 10    | f37                        | linear_1920x1080_raw10_30fps_1lane.c                    |
| 11    | imx415-30fps-2lane         | linear_3840x2160_raw10_30fps_2lane.c                    |
| 12    | imx415-30fps-4lane         | linear_3840x2160_raw10_30fps_4lane.c                    |
| 13    | sc202cs-1600x1200          | linear_1600x1200_raw10_30fps_1lane.c                    |
| 14    | irs2381c-tof               | linear_224x1903_raw12_5fps_2lane.c                      |
| 15    | sc035hgs-vc0               | linear_640x480_raw10_30fps_2lane_vc0.c                  |
| 16    | sc035hgs-vc1               | linear_640x480_raw10_30fps_2lane_vc1.c                  |
| 17    | sc231ai-30fps              | linear_1920x1080_raw10_30fps_2lane.c                    |
| 18    | imx586-30fps-4lane         | linear_3840x2160_raw10_30fps_4lane.c                    |
| 19    | os08c10-30fps-2lane        | linear_3840x2160_raw12_30fps_2lane.c                    |
| 20    | ar0233-30fps               | linear_1920x1080_raw12_30fps_2lane.c                    |
| 21    | ar0820std-30fps            | linear_3840x2160_yuv422_30fps_4lane.c                   |
| 22    | sc1336                     | linear_1280x720_raw10_15fps_2lane.c                     |
| 23    | dummy                      | dummy_sensor.c                                          |
| 24    | ar0233-30fps               | ar0233_linear_1920x1080_raw12_30fps_2lane_vc0.c         |
| 25    | ar0233-30fps               | ar0233_linear_1920x1080_raw12_30fps_2lane_vc1.c         |
| 26    | ov9782-200fps-2lane        | linear_640x360_raw10_200fps_2lane.c                     |
| 27    | ov9782-120fps-2lane        | linear_1280x720_raw10_120fps_2lane.c                    |
| 28    | imx219-640x480-30fps       | linear_640x480_raw10_30fps_2lane.c                      |
| 29    | imx219-1632x1232-30fps     | linear_1632x1232_raw10_30fps_2lane.c                    |
| 30    | imx219-1920x1080-30fps     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 31    | imx219-3264x2464-15fps     | linear_3264x2464_raw10_15fps_2lane.c                    |
| 32    | imx219-3264x2464-21fps     | linear_3264x2464_raw10_21fps_2lane.c                    |
| 33    | ov5647-640x480-60fps       | linear_640x480_raw10_60fps_2lane.c                      |
| 34    | ov5647-1280x960-30fps      | linear_1280x960_raw10_30fps_2lane.c                     |
| 35    | ov5647-1920x1080-30fps     | linear_1920x1080_raw10_30fps_2lane.c                    |
| 36    | ov5647-2592x1944-15fps     | linear_2592x1944_raw10_15fps_2lane.c                    |
| 37    | imx477-1280x960-120fps     | linear_1280x960_raw10_120fps_2lane.c                    |
| 38    | imx477-1920x1080-50fps     | linear_1920x1080_raw12_50fps_2lane.c                    |
| 39    | imx477-2016x1520-40fps     | linear_2016x1520_raw12_40fps_2lane.c                    |
| 40    | imx477-4000x3000-10fps     | linear_4000x3000_raw12_10fps_2lane.c                    |
| 41    | ov50h40-30fps-4lane        | linear_4096x3072_raw10_30fps_4lane.c                    |
| 42    | ox05b1s                    | linear_2592x1944_raw10_30fps_4lane.c                    |
| 43    | ox05b1s_2lane              | linear_2592x1944_raw10_10fps_2lane.c                    |
| 44    | imx415-60fps-4lane         | linear_3840x2160_raw10_60fps_4lane.c                    |
| 45    | sc850sl-30fps              | linear_3840x2160_raw10_30fps_4lane.c                    |
| 46    | shw3g-30fps                | linear_2064x1552_raw12_30fps_4lane.c                    |

#### isp_feedback 配置文件说明

当前支持的所有传感器都有与之对应的配置文件，在 `app/samples/platform_samples/vp_sensors` 目录中对这些配置文件进行维护。

相关说明参考本文中 [get_isp_data 配置文件说明 ](./sample_isp.html#span-id-get-isp-data-config-get-isp-data) 章节相关内容。

#### isp_feedback 运行效果

- 先使用 `get_vin_data -s 3` 获取一张 sc230ai 的 raw 图，`get_vin_data` 的使用详细参考 [sample_vin](../samples/sample_vin.html)。
- 接下来我们可以根据提示选择对应的 Camera Sensor 和准备好的 RAW 图，ISP 回灌时会使用对应的 Camera Sensor 的 ISP 效果库进行调校。

<div class="note">
<strong> 注意：</strong> <br>
	选择指定的 Camera Sensor 时，无需实际接入硬件设备。系统会将该传感器的参数应用到虚拟 Camera Sensor，并使用对应的 ISP 效果库进行调校。 <br>
</div>

```bash
./isp_feedback -s 3 -f handle_34661_vin_chn0_1920x1080_stride_3840_frameid_0_ts_18369924580342.raw
root@buildroot:/userdata# ./isp_feedback -s 3 -f handle_34661_vin_chn0_1920x1080_stride_3840_frameid_0_ts_18369924580342.raw
Using index:3  sensor_name:sc230ai-30fps  config_file:linear_1920x1080_raw10_30fps_1lane.c
dummy use calib sc230ai_tuning.json
[INFO] Create isp node handle: 100197
(dump_awb_attr)handle 100197 awb: version 1 mode 0manual_attr: gain: rgain: 0.000000grgain: 0.004043gbgain: 0.000000bgain: 0.004043
(dump_exp_attr)handle 100197 exp: version 0 mode 0manual_attr: gain: exp_time: 0.007022again: 1.000000dgain: 1.000000ispgain: 1.000000ae_exp: 79.692368cur_lux 0
isp(100197) dump yuv 1920x1080(stride:1920), buffer size: 2073600 + 1036800 frame id: 0, timestamp: 0
```

程序运行启动，会在当前目录保存如下调校后的的 yuv 图像：

```shell
isp_handle_100197_chn0_1920x1080_stride_1920_frameid_0_ts_0.yuv
```

### isp_feedback 常见问题

- 当 `isp_feedback` 指定的 RAW 图分辨率和格式与指定的 Camera Sensor 的分辨率及格式完全一致时，可以正常进行回灌。
- 如果指定的 Camera Sensor 分辨率或格式与回灌图像不匹配，可能会导致图像异常。
- 如果回灌发现对应颜色不对时，需要根据 -s 指定的 snesor 的实际的 bayer_start 和 bayer_pattern 去修改 dummy_sensor 的 sensor_param 属性。
	- 实际的 bayer_start 和 bayer_pattern 可以查看对应 sensor 的 spec。

## get_isp_rgb_ir

### get_isp_rgb_ir 功能概述

`get_isp_rgb_ir` 是基于 `get_isp_data` 的扩展工具，专用于从 **YUV 图像数据** 中分离 **RGB（可见光）** 分量与 **IR（红外）** 分量，并输出独立的图像帧。其核心功能包括：

1. **RGB/IR 分离**：通过 ISP 实现传感器原始数据的物理分离（移除 IR 污染 + 插值重建）。  
2. **双通道输出**：  
   - `isp_schn 0` → RGB 图像（ YUV 格式，只有 UV 分量，可见光分量）  
   - `isp_schn 2` → IR 图像（ YUV 格式，只有 Y 分量，红外分量）。  

#### get_isp_rgb_ir 软件架构说明

`get_isp_rgb_ir` 的软件架构与 `get_isp_data` 软件架构大体一致，只是多了 RGB 和 ISP 的分离以及分别保存数据帧的操作，具体如下图所示：

![get_isp_rgb_ir_framework.png](_static/_images/get_isp_data/get_isp_rgb_ir_framework.png)

上图中大部分节点在 [get_isp_data 软件架构](./sample_isp.html#span-id-get-isp-data-arch-get-isp-data)中已进行过说明，在此主要说明与 `get_isp_data` 的差异点：

1. **ISP 节点配置扩展**  
   - 在 `create_isp_node` 中新增 **双通道输出配置**：  
     - **Channel 0**：输出 RGB 可见光分量。
     - **Channel 2**：输出 IR 红外分量。

2. **数据捕获与保存逻辑修改**  
   - `dump_data` 中分两个步骤：  
     - **RGB 通道**：调用 `hbn_vnode_getframe(0)` 获取 RGB 帧数据。
     - **IR 通道**：调用 `hbn_vnode_getframe(2)` 获取 IR 帧数据。

#### get_isp_rgb_ir 代码位置及目录结构

`get_isp_rgb_ir` 相关源码路径为 `app/samples/platform_samples/sample_isp/get_isp_rgb_ir`，代码结构如下：

```shell
.
├── Makefile
└── get_isp_rgb_ir.c
```

- Makefile：用于编译程序的 Makefile 文件。
- get_isp_rgb_ir.c：程序的主要源代码文件。

#### get_isp_rgb_ir 工具位置及目录结构

工具位于板端 `/app/platform_samples/sample_isp/get_isp_rgb_ir` 目录下：

```shell
root@buildroot:/app/platform_samples/sample_isp/get_isp_rgb_ir# ls
get_isp_rgb_ir
```

`get_isp_rgb_ir` 即为源码编译出来的可执行文件。

#### get_isp_rgb_ir API 流程说明

`get_isp_rgb_ir` 的程序流程如下：

![get_isp_rgb_ir_flow_chart.png](_static/_images/get_isp_data/get_isp_rgb_ir_flow_chart.png)

上图中大部分节流程与 `get_isp_data` 的流程相同，主要改动如下：

1. **选项调整**：
   - 新增 **`-v` 详细日志模式**标志
   - 移除原图的 `-t` (settle值) 和 `-m` (传感器模式) 选项

2. **ISP 通道修改**：
   - 新增 **双通道配置**：`create_isp_node` 中创建 `RGB` 和 `IR` 两个 ISP 通道和缓存区。

3. **数据采集流程变更**：
   - `dump_data()` 执行 **双通道顺序采集**：

     ```c
     hbn_vnode_getframe(isp_node, 0, ...);  // RGB
     hbn_vnode_getframe(isp_node, 2, ...);  // IR
     ```

### get_isp_rgb_ir 编译部署

#### get_isp_rgb_ir 编译

在源码路径下执行 `make` 命令即可完成编译：

```Shell
cd app/samples/platform_samples/sample_isp/get_isp_rgb_ir
make
```

详细的程序编译方式请查阅 [编译方法](overview.html#span-id-sample-build) 章节。

#### get_isp_rgb_ir 硬件环境搭建

开发板上连接 `Camera Sensor` 的方法请查阅 [摄像头（ MIPI CSI）](../quick_start/x5_evb_1_b_user_guide.html#span-id-mipi-csi-port-mipi-csi) 章节。

#### get_isp_rgb_ir 程序部署

编译后的可执行文件一般在 `app/samples/platform_samples/sample_isp/get_isp_rgb_ir` 目录下：

```shell
├── Makefile
├── get_isp_rgb_ir
├── get_isp_rgb_ir.c
└── get_isp_rgb_ir.o
```

本 sample 的可执行文件位于板端 `/app/platform_samples/sample_isp/get_isp_rgb_ir` 目录，每次编译完成后，可以临时把 `get_isp_rgb_ir` 上传到板端 `/userdata` 目录下，并且运行 `chmod +x get_isp_rgb_ir` 命令给文件赋予可执行权限后即可使用。

### get_isp_rgb_ir 运行

#### get_isp_rgb_ir 程序运行方法

板端进入到 `/app/platform_samples/sample_isp/get_isp_rgb_ir` 目录，然后直接运行可执行文件即，命令格式如下：

```shell
./get_isp_rgb_ir <Option> <Sensor_index>
```

示例：

```shell
root@buildroot:~# cd /app/platform_samples/sample_isp/get_isp_rgb_ir/
root@buildroot:/app/platform_samples/sample_isp/get_isp_rgb_ir# ./get_isp_rgb_ir -s 43
```

**注意：** `get_isp_rgb_ir` 仅适用于能够获取 RGBIR pattern 的 Sensor，目前仅支持 Sensor OX05b1s。

#### get_isp_rgb_ir 程序参数选项说明

执行命令 `./get_isp_rgb_ir -h` 可以获得帮助信息和当前板端系统支持的 Camera Sensor 列表。

```bash
root@buildroot:/app/platform_samples/sample_isp/get_isp_rgb_ir# ./get_isp_rgb_ir -h
get_isp_rgb_ir -s/--sensor sensor_index
Options:
  -s, --sensor sensor_index   Specify the sensor index
  -v, --verbose               Enable detailed log information
Note: Default Offline Mode
index: 0  sensor_name: sc1330t                  config_file:linear_1280x960_raw10_30fps_1lane.c
index: 1  sensor_name: irs2875-tof              config_file:linear_208x1413_raw12_15fps_2lane.c
index: 2  sensor_name: sc230ai-10fps            config_file:linear_1920x1080_raw10_10fps_1lane.c
index: 3  sensor_name: sc230ai-30fps            config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 4  sensor_name: sc230ai-dol2-30fps       config_file:dol2_1920x1080_raw10_30fps_2lane.c
index: 5  sensor_name: sc132gs-1280p            config_file:linear_1088x1280_raw10_60fps_1lane.c
index: 6  sensor_name: sc132gs-hdr-2lane        config_file:hdr_1088x1280_raw10_30fps_2lane.c
index: 7  sensor_name: sc035hgs                 config_file:linear_640x480_raw10_30fps_1lane.c
index: 8  sensor_name: sc035hgs_mono            config_file:linear_mono_640x480_raw10_30fps_1lane.c
index: 9  sensor_name: ov5640                   config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 10  sensor_name: f37                     config_file:linear_1920x1080_raw10_30fps_1lane.c
index: 11  sensor_name: imx415-30fps-2lane      config_file:linear_3840x2160_raw10_30fps_2lane.c
index: 12  sensor_name: imx415-30fps-4lane      config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 13  sensor_name: sc202cs-1600x1200       config_file:linear_1600x1200_raw10_30fps_1lane.c
index: 14  sensor_name: irs2381c-tof            config_file:linear_224x1903_raw12_5fps_2lane.c
index: 15  sensor_name: sc035hgs-vc0            config_file:linear_640x480_raw10_30fps_2lane_vc0.c
index: 16  sensor_name: sc035hgs-vc1            config_file:linear_640x480_raw10_30fps_2lane_vc1.c
index: 17  sensor_name: sc231ai-30fps           config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 18  sensor_name: imx586-30fps-4lane      config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 19  sensor_name: os08c10-30fps-2lane     config_file:linear_3840x2160_raw12_30fps_2lane.c
index: 20  sensor_name: ar0233-30fps            config_file:linear_1920x1080_raw12_30fps_2lane.c
index: 21  sensor_name: ar0820std-30fps         config_file:linear_3840x2160_yuv422_30fps_4lane.c
index: 22  sensor_name: sc1336                  config_file:linear_1280x720_raw10_15fps_2lane.c
index: 23  sensor_name: dummy                   config_file:dummy_sensor.c
index: 24  sensor_name: ar0233-30fps            config_file:ar0233_linear_1920x1080_raw12_30fps_2lane_vc0.c
index: 25  sensor_name: ar0233-30fps            config_file:ar0233_linear_1920x1080_raw12_30fps_2lane_vc1.c
index: 26  sensor_name: ov9782-200fps-2lane     config_file:linear_640x360_raw10_200fps_2lane.c
index: 27  sensor_name: ov9782-120fps-2lane     config_file:linear_1280x720_raw10_120fps_2lane.c
index: 28  sensor_name: imx219-640x480-30fps    config_file:linear_640x480_raw10_30fps_2lane.c
index: 29  sensor_name: imx219-1632x1232-30fps  config_file:linear_1632x1232_raw10_30fps_2lane.c
index: 30  sensor_name: imx219-1920x1080-30fps  config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 31  sensor_name: imx219-3264x2464-15fps  config_file:linear_3264x2464_raw10_15fps_2lane.c
index: 32  sensor_name: imx219-3264x2464-21fps  config_file:linear_3264x2464_raw10_21fps_2lane.c
index: 33  sensor_name: ov5647-640x480-60fps    config_file:linear_640x480_raw10_60fps_2lane.c
index: 34  sensor_name: ov5647-1280x960-30fps   config_file:linear_1280x960_raw10_30fps_2lane.c
index: 35  sensor_name: ov5647-1920x1080-30fps  config_file:linear_1920x1080_raw10_30fps_2lane.c
index: 36  sensor_name: ov5647-2592x1944-15fps  config_file:linear_2592x1944_raw10_15fps_2lane.c
index: 37  sensor_name: imx477-1280x960-120fps  config_file:linear_1280x960_raw10_120fps_2lane.c
index: 38  sensor_name: imx477-1920x1080-50fps  config_file:linear_1920x1080_raw12_50fps_2lane.c
index: 39  sensor_name: imx477-2016x1520-40fps  config_file:linear_2016x1520_raw12_40fps_2lane.c
index: 40  sensor_name: imx477-4000x3000-10fps  config_file:linear_4000x3000_raw12_10fps_2lane.c
index: 41  sensor_name: ov50h40-30fps-4lane     config_file:linear_4096x3072_raw10_30fps_4lane.c
index: 42  sensor_name: ox05b1s                 config_file:linear_2592x1944_raw10_30fps_4lane.c
index: 43  sensor_name: ox05b1s_2lane           config_file:linear_2592x1944_raw10_10fps_2lane.c
index: 44  sensor_name: imx415-60fps-4lane      config_file:linear_3840x2160_raw10_60fps_4lane.c
index: 45  sensor_name: sc850sl-30fps           config_file:linear_3840x2160_raw10_30fps_4lane.c
index: 46  sensor_name: shw3g-30fps             config_file:linear_2064x1552_raw12_30fps_4lane.c
```

**注意**：上面列表中的 `index: 42  sensor_name: ox05b1s` 是 ox05b1s 的 4lane 配置，需要修改 sensor ox05b1s 驱动代码，加载 4lane 寄存器配置才能选择。

**参数选项说明**：

| **选项**      | **含义**                              | **必选** |  
|---------------|---------------------------------------|----------|  
| `-s <index>`  | 传感器索引（`vp_show_sensors_list` 函数输出） | 是       |  
| `-v`          | 启用详细帧信息输出（打印 `hbn_vnode_image_t`） | 否       |  
| `-h`          | 显示帮助信息                            | 否       |  

#### get_isp_rgb_ir 配置文件说明

当前支持的所有传感器都有与之对应的配置文件，在 `app/samples/platform_samples/vp_sensors` 目录中对这些配置文件进行维护。

相关说明参考本文中 [get_isp_data 配置文件说明](./sample_isp.html#span-id-get-isp-data-config-get-isp-data) 章节相关内容。

**注意：** 当前 `get_isp_rgb_ir` 默认配置的 sensor 的 vin → isp 的通路模式为 `offline mode`，所以 sensor config 中也需要配置为 `offline mode`，主要是 `cim_isp_flyby` 和 `input_mode` 属性，具体如下：

```c
static vin_node_attr_t vin_node_attr = {
	.cim_attr = {
		.mipi_rx = 0,  // vcon 0
		.vc_index = 0,
		.ipi_channel = 1,
		.cim_isp_flyby = 0,  // 0: offline ; 1: online
		......
}

static isp_attr_t isp_attr = {
	.input_mode = 2, // 0: online, 2: offline
	......
}
```

#### get_isp_rgb_ir 运行效果

`get_isp_rgb_ir` 的运行效果与 `get_isp_data` 相似，具体细节可以参考  [get_isp_data 运行效果](./sample_isp.html#span-id-get-isp-data-run-get-isp-data)章节，两者的主要区别在于，当执行 `get_isp_rgb_ir` 时，会生成两个 YUV 文件，分别对应 RGB 分量和 IR 分量的图像：

```bash
root@buildroot:/app/platform_samples/sample_isp/get_isp_rgb_ir# ./get_isp_rgb_ir -s 43
Using index:43  sensor_name:ox05b1s_2lane  config_file:linear_2592x1944_raw10_30fps_2lane.c
mipi mclk is configed.
Searching camera sensor on device: /proc/device-tree/soc/cam/vcon@0 i2c bus: 4 mipi rx phy: 0
INFO: Found sensor_name:ox05b1s_2lane on mipi rx csi 0, i2c addr 0x36, config_file:linear_2592x1944_raw10_30fps_2lane.c

***************  Command Lists  ***************
 g      -- get single frame 
 l      -- get a set frames 
 q      -- quit  
 h      -- print help message

Command: g
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_0_ts_1026275109155.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_0_ts_1026275109155.yuv

Command: l
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_1_ts_1026408535614.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_1_ts_1026408535614.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_2_ts_1026508510822.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_2_ts_1026508510822.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_3_ts_1026608501822.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_3_ts_1026608501822.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_4_ts_1026708507781.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_4_ts_1026708507781.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_7_ts_1027008512614.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_7_ts_1027008512614.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_29_ts_1029208508573.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_30_ts_1029308514907.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_30_ts_1029308514907.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_31_ts_1029408504532.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_31_ts_1029408504532.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_32_ts_1029508510074.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_32_ts_1029508510074.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_33_ts_1029608516740.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_33_ts_1029608516740.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_34_ts_1029708507240.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_34_ts_1029708507240.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_35_ts_1029808515365.yuv
Dumping rgb frame to file: handle_100197_ox05b1s_2lane_rgb_frameid_35_ts_1029808515365.yuv
Dumping ir frame to file: handle_100197_ox05b1s_2lane_ir_frameid_36_ts_1029908519865.yuv

Command: q
quit
```

可以看到，执行 `get_isp_rgb_ir` 后，将获得两个时间戳一致的文件，这两个文件分别代表了从同一帧 ISP 图像中分离出来的 RGB 分量和 IR 分量。

#### get_isp_rgb_ir 常见问题

1. sensor config 没有配置为 offline 模式，导致执行失败。
2. 测试用的 sensor 硬件不支持 RGBIR pattern，导致执行失败。
