API GUIDE / VIC / LL
G32S10 VIC LL 接口
LL 层接口:实例宏定义(isp_regs.h):
1. 资源模型
1.1 实例与基地址
| HAL 端口 | 实例宏 | 基地址 | IRQ | 子模块 |
|---|---|---|---|---|
| ISP0 | ISP0 | 0x13350000 | IRQ_ISP0 = IRQ_PLIC0_START + 19 | TOP/AE/IPC/DMSC/WDMA/RESP/VIC |
| ISP1 | ISP1 | 0x13360000 | IRQ_ISP1 = IRQ_PLIC0_START + 18 | TOP/AE/IPC/DMSC/WDMA/RESP/VIC |
实例宏定义(isp_regs.h):
#define ISP0 ((isp_regs_t *)(uintptr_t)ISP0_IOBASE) #define ISP1 ((isp_regs_t *)(uintptr_t)ISP1_IOBASE)
补充说明:
ISP0_IOBASE/ISP1_IOBASE定义在code/soc/g32s10/include/base.h。HAL 只接受
ISP0或ISP1,其余指针一律按参数错误处理(各模块通过ll_vic_is_instance()判定)。实例与物理输入的对应关系由板级决定。例如
g32s103_sk_slt板:CON1 的 DVP 接 CIM1 (ISP1),CON2 的 MIPI 接 CSI0(ISP0)。以自己板子的 BSP 配置为准。ISP1 没有 AE 与 DMSC 寄存器块。对
ISP1调用 AE/DMSC 接口虽然不会崩溃 (寄存器窗口仍在同一地址段),但读回/写入没有意义。
2. LL 接口规范
LL 层只做单字段读写和单比特操作,不做参数范围检查,不保证多字段编程顺序;除注明外,
第一个参数都是 isp_regs_t *ispx 或 const isp_regs_t *ispx。
使用注意:
全部是
static inline,不会带来函数调用开销,也不会做参数校验。LL 写 VIC 寄存器不等于生效:多数 VIC 配置要等
REG_EN提交,见ll_vic_update_enable。LL 写不触发 HAL 的默认值填充,也不处理 WDMA 地址 FIFO 满、复位自清等状态机。
调试探针用完要恢复原值并复位模块,否则残留配置会带进下一次出流。
2.1 ll_vic.h
| 接口 | 说明 |
|---|---|
ll_vic_is_instance | 判断指针是否为 ISP0/ISP1 |
ll_vic_reset / ll_vic_reset_done | 请求复位 / 查询复位是否自清完成 |
ll_vic_update_enable / ll_vic_update_pending | 置位 REG_EN / 查询待更新状态 |
ll_vic_start / ll_vic_stop / ll_vic_started | 置位、清除、查询 START |
ll_vic_intf_set/get | 输入接口选择(0 BT656、2 MIPI、3 DVP) |
ll_vic_res_width_set/get、ll_vic_res_height_set/get | 输出分辨率 |
ll_vic_hact_set/get | 有效水平周期数 |
ll_vic_vld_frame_height_set/get、ll_vic_vld_frame_width_set/get | 有效帧高/宽 |
ll_vic_pck_mask_set/get | SAV/EAV 检查掩码 |
ll_vic_dvp_fmt_set/get | DVP 数据格式 |
ll_vic_dvp_yuv_set/get | YUV 字节序 |
ll_vic_dvp_mode_set/get | DVP 时序模式 |
ll_vic_dvp_hsync_pol_set/get、ll_vic_dvp_vsync_pol_set/get | 同步极性 |
ll_vic_dvp_scan_set/get | 扫描模式(仅逐行) |
ll_vic_dvp_field_set/get | 场选择 |
ll_vic_dvp_raw_align_set/get | RAW 对齐;低位模式映射 RAW8[7:0]/RAW10[9:0]/RAW12[11:0],高位模式映射 RAW8[11:4]/RAW10[11:2]/RAW12[11:0] |
ll_vic_dvp_bus_set/get | YUV422 8-bit 总线选择 |
ll_vic_dvp_img_check_enable/disable/enabled | DVP 图像尺寸检查 |
ll_vic_hfb_set/get、ll_vic_hbb_set/get、ll_vic_dvp_vblank_set/get | 水平前/后消隐与垂直消隐 |
ll_vic_bf_colorbar_enable/disable/enabled | BF 彩条总使能 |
ll_vic_bf_colorbar_replace_enable/disable/enabled | 仅替换数据使能 |
ll_vic_bf_colorbar_frame_infinite_enable/disable/frame_infinite | 无限帧模式 |
ll_vic_bf_colorbar_frame_num_set/get | 有限帧数 |
ll_vic_bf_colorbar_hblank_set/get、ll_vic_bf_colorbar_vblank_set/get | 彩条消隐 |
ll_vic_colorbar_pack_ycbcr | 把 Y/Cb/Cr 打包为寄存器值 |
ll_vic_colorbar_value_set/get、ll_vic_colorbar2_value_set/get | 两组彩条颜色 |
ll_vic_dvp_edge_set/get | PCLK 采样沿 |
ll_vic_vld_line_sav_set/get、ll_vic_vld_line_eav_set/get | Sony 行 SAV/EAV 码 |
ll_vic_dvp_hcomp_enable/disable/enabled | DVP 水平比较 |
ll_vic_bt_width_set/get | BT656 总线宽度 |
ll_vic_bt_sync_set/get | BT656 SAV/EAV 顺序 |
ll_vic_mipi_fmt_set/get | MIPI 像素格式 |
ll_vic_mipi_width4_set/get | MIPI 4 字节字宽 |
ll_vic_mipi_hcrop_all_width_set/get | MIPI 裁剪前总宽 |
ll_vic_mipi_hcrop_start_pixel_set/get | MIPI 水平裁剪起点 |
ll_vic_mipi_vcrop_set/get | MIPI 垂直裁剪起点 |
ll_vic_mipi_vcomp_enable/disable/enabled、ll_vic_mipi_hcomp_enable/disable/enabled | MIPI 垂直/水平比较 |
ll_vic_mipi_sync_set/get | MIPI 同步模式 |
ll_vic_mipi_dt_check_enable/disable/enabled | MIPI 数据类型检查 |
ll_vic_mipi_dt_set/get | MIPI 数据类型 |
ll_vic_mipi_start_delay_set/get | MIPI 启动延迟(Sony 传感器用 1,其余用 0) |
ll_vic_mipi_start_ch_set/get | MIPI 启动通道(正常为 0) |
ll_vic_mipi_frame_set/get | 传感器帧模式(正常为 0) |
ll_vic_out_vertical_delay_set/get、ll_vic_out_horizontal_delay_set/get | 输出延迟;手册建议 16,最小 1 |
ll_vic_out_route_set/get | 输出路由(0 = Tiziano,4 = 停止) |
ll_vic_fend_delay_set/get | 帧尾延迟 |
ll_vic_irq_status_get | 读 INT_STA |
ll_vic_irq_status_clear | 写 INT_CLR(写 1 清除) |
ll_vic_irq_mask_set/get、ll_vic_irq_mask、ll_vic_irq_unmask | 中断屏蔽配置;硬件 1 = 屏蔽 |
ll_vic_state_get | 读 W_STATE[6:0] |
ll_vic_cur_pixel_get、ll_vic_cur_line_get | 当前像素/行计数 |
2.2 ll_isp_top.h
| 接口 | 说明 |
|---|---|
ll_isp_top_read_version | 读 TOP 版本 |
ll_isp_top_set/get_shadow_select | 影子寄存器选择 |
ll_isp_top_trigger_reset、ll_isp_top_is_reset_requested | 请求功能复位 / 查询请求位 |
ll_isp_top_enable/disable_dmsc_bypass、ll_isp_top_is_dmsc_bypass_enabled | DMSC 旁路 |
ll_isp_top_enable/disable_raw_test_pattern、ll_isp_top_is_raw_test_pattern_enabled | RAW 测试图(is_* 在硬件位为 0 时返回真) |
ll_isp_top_enable/disable_rgb_test_pattern、ll_isp_top_is_rgb_test_pattern_enabled | RGB 测试图 |
ll_isp_top_enable/disable_yuv_test_pattern、ll_isp_top_is_yuv_test_pattern_enabled | YUV 测试图 |
ll_isp_top_select_dmsc_shadow_register_write、ll_isp_top_select_dmsc_pre_shadow_register_write、ll_isp_top_get_dmsc_shadow_write_select | DMSC 影子/预影子写选择 |
ll_isp_top_enable/disable_ae_statistics、ll_isp_top_is_ae_statistics_enabled | AE 统计使能 |
ll_isp_top_enable/disable_histogram、ll_isp_top_is_histogram_enabled | 直方图使能 |
ll_isp_top_stop_ae_statistics、ll_isp_top_is_ae_statistics_stop_requested | 停止 AE 统计 |
ll_isp_top_stop_histogram、ll_isp_top_is_histogram_stop_requested | 停止直方图 |
ll_isp_top_trigger_statistics_reset、ll_isp_top_is_statistics_reset_requested | 统计复位 |
ll_isp_top_set/get_statistics_position | 统计位置(0 IPC、1 DMSC、其余保留) |
ll_isp_top_set/get_frame_width、ll_isp_top_set/get_frame_height | 帧尺寸 |
ll_isp_top_set/get_input_data_type、ll_isp_top_set/get_bayer_type | 输入类型与 Bayer 类型 |
ll_isp_top_set/get_ipc_line_space、ll_isp_top_set/get_normal_line_space | IPC/普通行间距 |
ll_isp_top_enable/disable_overflow_stop、ll_isp_top_is_overflow_stop_enabled | 溢出停止 |
ll_isp_top_stop、ll_isp_top_is_stop_requested | 停止请求 |
ll_isp_top_read_stop_state | 读 STOP_STATE |
ll_isp_top_trigger_shadow、ll_isp_top_is_shadow_trigger_requested | 影子触发 |
2.3 ll_isp_ipc.h
| 接口 | 说明 |
|---|---|
ll_isp_ipc_read_soft_version、ll_isp_ipc_read_hard_version | 版本读取 |
ll_isp_ipc_trigger、ll_isp_ipc_is_trigger_requested | 触发与请求位查询 |
ll_isp_ipc_set/get_output_number | 输出通道数 |
ll_isp_ipc_set/get_output_map | 输出映射 |
ll_isp_ipc_enable/disable_overflow_restart、ll_isp_ipc_is_overflow_restart_enabled | 溢出后重启 |
ll_isp_ipc_enable/disable_size_error_restart、ll_isp_ipc_is_size_error_restart_enabled | 尺寸错误后重启 |
ll_isp_ipc_set/get_trigger_mode | 触发模式(0 正常、1 一帧后停止) |
ll_isp_ipc_set/get_channel0_trigger_select | 通道 0 触发源(0 不启动) |
ll_isp_ipc_set/get_y_offset、ll_isp_ipc_set/get_uv_offset | 输出偏移 |
2.4 ll_isp_resp.h
| 接口 | 说明 |
|---|---|
ll_isp_resp_trigger_all_clear | 写 INT_CTRL bit16 清全部事件 |
ll_isp_resp_enable/disable/is_common0_read_clear | COMMON_0 读清除模式 |
ll_isp_resp_enable/disable/is_unusual0_read_clear | UNUSUAL_0 读清除模式 |
ll_isp_resp_enable/disable/is_backup0_read_clear | BACKUP_0 读清除模式 |
ll_isp_resp_set_common0_interrupt_enable、ll_isp_resp_clear_common0_interrupt、ll_isp_resp_read_common0_interrupt_state、ll_isp_resp_set_common0_interrupt_mask | COMMON_0 使能/清除/状态/CPU 掩码 |
ll_isp_resp_set_unusual0_interrupt_enable、ll_isp_resp_clear_unusual0_interrupt、ll_isp_resp_read_unusual0_interrupt_state、ll_isp_resp_set_unusual0_interrupt_mask | UNUSUAL_0 同上 |
ll_isp_resp_set_backup0_interrupt_enable、ll_isp_resp_clear_backup0_interrupt、ll_isp_resp_read_backup0_interrupt_state、ll_isp_resp_set_backup0_interrupt_mask | BACKUP_0 同上 |
ll_isp_resp_read_breakpoint_info | 读断点信息:bit0 DMSC 输入、bit1 AE 输入、bit2 GPL_WDMA 输入 |
ll_isp_resp_get_position_hcount、ll_isp_resp_get_position_vcount | 指定位置索引的水平/垂直计数 |
补充说明:事件源使能 1 = 使能;CPU 掩码 1 = 允许中断、0 = 阻止。读清除模式下, 读取状态会把返回的位清除。
2.5 ll_isp_wdma.h
| 接口 | 说明 |
|---|---|
ll_isp_wdma_read_soft_version、ll_isp_wdma_read_hard_version | 版本读取 |
ll_isp_wdma_request_soft_reset、ll_isp_wdma_clear_soft_reset、ll_isp_wdma_is_soft_reset_requested | 软件复位 |
ll_isp_wdma_set/get_mux_sel | 数据源 |
ll_isp_wdma_set/get_dump_data_type | 数据排布 |
ll_isp_wdma_set/get_dump_data_order | 字节序 |
ll_isp_wdma_set/get_start_address、ll_isp_wdma_set/get_chroma_start_address | 起始地址(寄存器存放地址右移 3 位,读回左移还原) |
ll_isp_wdma_set/get_stride、ll_isp_wdma_set/get_chroma_stride | 步长(同样按 8 字节单位编码) |
ll_isp_wdma_read_done_address、ll_isp_wdma_read_chroma_done_address | 完成地址(原始值) |
ll_isp_wdma_is_dump_enabled | DUMP_EN 状态 |
ll_isp_wdma_read_y_start_address_debug_raw、ll_isp_wdma_read_chroma_start_address_debug_raw | 地址 FIFO 调试原始值 |
ll_isp_wdma_read_y_end_address_debug_raw、ll_isp_wdma_read_chroma_end_address_debug_raw | 结束地址调试原始值 |
ll_isp_wdma_get_address_fifo_free_count_from_raw、ll_isp_wdma_get_address_fifo_data_count_from_raw | 从原始值解码空闲/已用项数 |
ll_isp_wdma_is_address_fifo_full_from_raw、ll_isp_wdma_is_address_fifo_empty_from_raw | 从原始值解码满/空标志 |
ll_isp_wdma_set/get_y_priority_level、ll_isp_wdma_set/get_y_priority_limit | Y DMA 优先级 |
ll_isp_wdma_set/get_chroma_priority_level、ll_isp_wdma_set/get_chroma_priority_limit | UV DMA 优先级 |
2.6 ll_isp_dmsc.h
| 接口 | 说明 |
|---|---|
ll_isp_dmsc_read_soft_version、ll_isp_dmsc_read_hard_version | 版本读取 |
ll_isp_dmsc_set/get_output_option | 输出选项 |
ll_isp_dmsc_set/get_input_mode | 输入模式 |
ll_isp_dmsc_set/get_uv_resolution_mode | UV 分辨率模式 |
ll_isp_dmsc_set/get_r_offset、ll_isp_dmsc_set/get_g_offset、ll_isp_dmsc_set/get_b_offset | RGB 偏移 |
ll_isp_dmsc_set/get_matrix_00 ~ matrix_22 | 3×3 矩阵系数(逐个字段) |
ll_isp_dmsc_set/get_y_offset、ll_isp_dmsc_set/get_uv_offset | 输出偏移 |
ll_isp_dmsc_set/get_y_clip_min、set/get_y_clip_max、set/get_uv_clip_min、set/get_uv_clip_max | 输出裁剪 |
ll_isp_dmsc_read_debug0_raw、ll_isp_dmsc_read_debug1_raw | 读调试寄存器原始值 |
ll_isp_dmsc_get_fifo_data_count、ll_isp_dmsc_get_fifo_free_count | FIFO 已用/空闲项数 |
ll_isp_dmsc_get_transfer_state | 输出状态机 |
ll_isp_dmsc_is_fifo_underflow、is_fifo_overflow、is_fifo_empty、is_fifo_full | FIFO 标志 |
ll_isp_dmsc_is_input_backpressure | 输入反压 |
2.7 ll_isp_ae.h
| 接口 | 说明 |
|---|---|
ll_isp_ae_read_soft_version、ll_isp_ae_read_hard_version | 版本读取 |
ll_isp_ae_enable/disable/is_shadow | 影子更新 |
ll_isp_ae_set/get_zone_h_start、set/get_zone_v_start、set/get_zone_h_number、set/get_zone_v_number | 分区网格 |
ll_isp_ae_set/get_horizontal_zone_size_1 ~ _15 | 水平分区尺寸 |
ll_isp_ae_set/get_vertical_zone_size_1 ~ _15 | 垂直分区尺寸 |
ll_isp_ae_set/get_dark_threshold、set/get_saturation_threshold | 亮度阈值 |
ll_isp_ae_set/get_histogram_frequency、set/get_statistics_frequency | 统计频率 |
ll_isp_ae_enable/disable/is_histogram_read_mode | 直方图读模式 |
ll_isp_ae_enable/disable/is_histogram_trigger_mode | 直方图触发模式 |
ll_isp_ae_set/get_statistics_dma_base、set/get_histogram_dma_base | DMA 基址(带索引参数) |
ll_isp_ae_set/get_statistics_dma_number、set/get_histogram_dma_number | DMA 缓冲数(硬件为 count−1) |
ll_isp_ae_enable/disable/is_statistics_dma_monitor、enable/disable/is_histogram_dma_monitor | DMA 监视 |
ll_isp_ae_enable/disable/is_interrupt_improve_drop | 中断期间丢帧 |
ll_isp_ae_set/get_statistics_dma_priority、set/get_histogram_dma_priority | DMA 优先级 |
ll_isp_ae_enable/disable/is_drop_frame_backpressure | 丢帧反压 |
ll_isp_ae_read_dma_info_raw | 读 DMA 信息原始值 |
ll_isp_ae_read_histogram_current_base、read_statistics_current_base、read_frame_number | 当前缓冲与帧号 |
ll_isp_ae_is_dma_stop_acknowledged、is_statistics_dma_mismatched、is_histogram_dma_mismatched | DMA 状态 |
ll_isp_ae_set/get_specific_horizontal_start/end、set/get_specific_vertical_start/end | 特定窗口 |
ll_isp_ae_set/get_specific_frame_number_in、read_specific_frame_number_out | 特定窗口输入/输出帧号 |
ll_isp_ae_read_specific_dark_sum、read_specific_mid_sum、read_specific_saturation_sum | 特定窗口像素和 |
ll_isp_ae_read_specific_dark_count、read_specific_saturation_count | 特定窗口像素计数 |
ll_isp_ae_enable/disable/is_ram_busy_backpressure | RAM 忙反压 |
补充说明:分区尺寸 1–4 写 HOR_ZONE_SIZE_14,5–8 写 _58,9–12 写 _912,
13–15 写 _1315(其中第 5、9、13 项使用各自寄存器的最低字节);垂直方向同理。
3. 寄存器映射与位域约定
本章的偏移全部是实例内偏移:实际地址 = ISPx_IOBASE + 偏移。字段名沿用 SDK
寄存器头文件的命名;寄存器手册里有而 SDK 没有的名字会单独标注。
3.1 实例寄存器块
struct isp_regs 的成员与偏移:
| 成员 | 类型 | 偏移 |
|---|---|---|
top | isp_top_regs_t | 0x0000 |
ae | isp_ae_regs_t | 0x2000 |
ipc | isp_ipc_regs_t | 0x3000 |
dmsc | isp_dmsc_regs_t | 0x4000 |
wdma | isp_wdma_regs_t | 0x9000 |
resp | isp_resp_regs_t | 0xA000 |
vic | vic_regs_t | 0xD000 |
3.2 TOP
| 偏移 | 名称 | 字段 |
|---|---|---|
0x0000 | VERSION | 版本 |
0x0020 | CON | SHD_SEL bit12 |
0x0024 | RST | FUN_RST bit2 |
0x0040 | BYPASS | DMSC_BYPASS bit9 |
0x0044 | BYPASS1 | TPRAW bit0、TPRGB bit1、TPYUV bit2(0 = 启用测试图) |
0x0048 | REG_CON | DMSC_WRITE_SEL bit9 |
0x0060 | STATIC_EN | bit0 AE 统计、bit1 直方图 |
0x0064 | STATIC_STOP | bit0 AE、bit1 直方图 |
0x0068 | STATIC_RST | bit0 |
0x006C | STATIC_POS | [2:0] |
0x0080 | FRM_SIZE | HEIGHT[15:0]、WIDTH[31:16] |
0x0088 | BAYER_TYPE | BAYER[4:0]、DATA_TYPE[9:8] |
0x0090 | LINE_SPACE_0 | IPC[15:0]、NML[31:16] |
0x0100 | STOP_CON | bit0 |
0x0104 | STOP_STATE | 只读 |
0x0320 | SHD_TEST_CTRL | bit0 |
0x0330 | OVERFLOW_STOP_EN | bit0 |
3.3 IPC
| 偏移 | 名称 | 字段 |
|---|---|---|
0x3000 | SOFT_VERSION | 软件版本 |
0x3004 | HARD_VERSION | 硬件版本 |
0x3020 | TRIGE | bit0 |
0x3030 | OUT_NUM | [4:0] |
0x3034 | OUT_MAP | 32 位映射 |
0x3040 | RESTART | SIZE_ERR bit0、OVERFLOW bit4 |
0x3044 | TRIGE_SEL | CH0[2:0]、TRIGGER_MODE bit16 |
0x3050 | OFFSET | Y[8:0]、UV[24:16] |
3.4 RESP
| 偏移 | 名称 | 字段 |
|---|---|---|
0xA000 | INT_CTRL | COMMON0_EN bit0、UNUSUAL0_EN bit4、BACKUP0_EN bit8、ALL_CLR bit16 |
0xA020 | COMMON0_INT_EN | 事件使能 |
0xA024 | COMMON0_INT_CLR | 写 1 清除 |
0xA028 | COMMON0_INT_STATE | 状态 |
0xA02C | COMMON0_INT_MASK | 1 = 允许上报 CPU |
0xA060 | UNUSUAL0_INT_EN | 同上组结构 |
0xA064 | UNUSUAL0_INT_CLR | |
0xA068 | UNUSUAL0_INT_STATE | |
0xA06C | UNUSUAL0_INT_MASK | |
0xA0A0 | BACKUP0_INT_EN | 同上组结构 |
0xA0A4 | BACKUP0_INT_CLR | |
0xA0A8 | BACKUP0_INT_STATE | |
0xA0AC | BACKUP0_INT_MASK | |
0xA100 | BP_INFO | bit0 DMSC 输入、bit1 AE 输入、bit2 WDMA 输入 |
0xA200 | POSITION_INFO[0] | HCNT[15:0]、VCNT[31:16] |
0xA204 | POSITION_INFO[1] | 同上 |
0xA208 | POSITION_INFO[2] | 同上 |
事件位:
| 组 | 位 | 事件 |
|---|---|---|
COMMON_0 | 2 | AE 统计完成 |
COMMON_0 | 3 | AE 直方图完成 |
COMMON_0 | 16 | STOP |
COMMON_0 | 20 | GPL_WDMA 完成 |
COMMON_0 | 26 | IPC 帧开始 |
COMMON_0 | 27 | IPC 帧完成 |
COMMON_0 | 28 | IPC 通道 0 开始 |
COMMON_0 | 30 | IPC 通道 0 结束 |
UNUSUAL_0 | 2 | IPC 尺寸错误 |
UNUSUAL_0 | 3 | IPC 溢出 |
UNUSUAL_0 | 6 | AE 错误 |
UNUSUAL_0 | 7 | AE 直方图错误 |
BACKUP_0 | 9 | DMSC 帧完成 |
BACKUP_0 | 23 | AE 帧完成 |
3.5 GPL_WDMA
| 偏移 | 名称 | 字段 |
|---|---|---|
0x9000 | SOFT_VERSION | 软件版本 |
0x9004 | HARD_VERSION | 硬件版本 |
0x9044 | SOFT_RESET | bit0 |
0x9054 | MUX_SEL | SOURCE[7:0]、TYPE[18:16]、ORDER[26:24] |
0x9058 | START_ADDR | [28:3](8 字节单位) |
0x905C | C_START_ADDR | [28:3] |
0x9060 | STRIDE | Y[15:3]、C[31:19] |
0x9068 | DONE_ADDR | Y 完成地址原始值 |
0x906C | C_DONE_ADDR | UV 完成地址原始值 |
0x9070 | DUMP_EN | bit0 |
0x9084 | EXT_PRIO | Y LEVEL[1:0]/LIMIT[12:4],C LEVEL[17:16]/LIMIT[28:20] |
0x90C0 | DBG_00_00 | Y 地址 FIFO |
0x90C4 | DBG_01_01 | UV 地址 FIFO |
0x90C8 | DBG_02_02 | Y 结束地址 FIFO |
0x90CC | DBG_03_03 | UV 结束地址 FIFO |
地址 FIFO 调试编码:bit0 = empty、bit4 = full、bits[10:8] = data 计数、 bits[14:12] = free 计数;深度 4。
3.6 DMSC
| 偏移 | 名称 | 字段 |
|---|---|---|
0x4000 | SOFT_VERSION | 软件版本 |
0x4004 | HARD_VERSION | 硬件版本 |
0x4040 | OUT_OPT | [1:0] |
0x404C | IN_MODE | INPUT_MODE bit0、RESMODE_UV[6:4]、R_OFFSET[24:16] |
0x4050 | SUB | G_OFFSET[8:0]、B_OFFSET[20:12] |
0x4054 | PAR_0 | m00[8:0]、m01[19:10]、m02[27:20] |
0x4058 | PAR_1 | m10[8:0]、m11[18:10]、m12[29:20] |
0x405C | PAR_2 | m20[9:0]、m21[19:10]、m22[28:20] |
0x4060 | OFFSET | Y_OFFSET[7:0]、UV_OFFSET[15:8] |
0x4064 | CLIP_MINMAX | Y_MIN[7:0]、Y_MAX[15:8]、UV_MIN[23:16]、UV_MAX[31:24] |
0x4068 | DEBUG_0 | DATA_NUM[1:0]、FREE_NUM[17:16] |
0x406C | DEBUG_1 | TRANS_STATE[5:0]、UNDERFLOW bit8、OVERFLOW bit12、EMPTY bit16、FULL bit20、I_BP bit24 |
3.7 AE
| 偏移 | 名称 | 字段 |
|---|---|---|
0x2000 | SOFT_VERSION | 软件版本 |
0x2004 | HARD_VERSION | 硬件版本 |
0x2010 | SHD_CTRL | bit0 |
0x2040 | ZONE_NUM_START | V_START[11:0]、V_NUM[15:12]、H_START[27:16]、H_NUM[31:28] |
0x2044 | HOR_ZONE_SIZE_14 | 4 个 8 位尺寸 |
0x2048 | HOR_ZONE_SIZE_58 | 4 个 8 位尺寸 |
0x204C | HOR_ZONE_SIZE_912 | 4 个 8 位尺寸 |
0x2050 | HOR_ZONE_SIZE_1315 | 3 个有效 8 位尺寸 |
0x2054 | VER_ZONE_SIZE_14 | 4 个 8 位尺寸 |
0x2058 | VER_ZONE_SIZE_58 | 4 个 8 位尺寸 |
0x205C | VER_ZONE_SIZE_912 | 4 个 8 位尺寸 |
0x2060 | VER_ZONE_SIZE_1315 | 3 个有效 8 位尺寸 |
0x2064 | LUM_TH_FREQ | DARK[7:0]、SAT[15:8]、HIST_FREQ[19:16]、STAT_FREQ[23:20]、HIST_READ bit24、HIST_TRIGGER bit28 |
0x2068–0x2074 | AE_DMA_BASE[0..3] | 统计 DMA 基址 |
0x2078–0x2084 | HIST_DMA_BASE[0..3] | 直方图 DMA 基址 |
0x2088 | DMA_BASE_NUM | DMA_NUM[1:0]、HIST_DMA_NUM[5:4]、MNT bit8、HIST_MNT bit12、INT_IMPRV bit16、EXT_PRIO[21:20]、HIST_EXT_PRIO[25:24]、DROP_FRM bit28 |
0x208C | DMA_INFO | HIST_CUR_BASE[1:0]、CUR_BASE[5:4]、FRAME_NUM[15:8]、DMA_STOP_ACK bit16、DMA_MISMATCH bit20、HIST_DMA_MISMATCH bit24 |
0x2090 | SPEC_ZONE_HSIZE | START[11:0]、END[27:16] |
0x2094 | SPEC_ZONE_VSIZE | 同上 |
0x2098 | SPEC_FRAME_NUM_IN | 8 位帧号 |
0x209C | SPEC_SUM_DARK | 28 位 |
0x20A0 | SPEC_SUM_MID | 28 位 |
0x20A4 | SPEC_SUM_SAT | 28 位 |
0x20A8 | SPEC_CNT_DARK | 20 位 |
0x20AC | SPEC_CNT_SAT | 20 位 |
0x20B4 | SPEC_FRAME_NUM_OUT | 8 位帧号 |
0x20B8 | RAM_BUSY_EN | bit0 |
3.8 VIC
| 偏移 | 名称 | 字段 |
|---|---|---|
0xD010 | CTRL | START bit0、REG_EN bit1、RST bit2 |
0xD014 | RES | V[15:0]、H[31:16] |
0xD018 | FRM_ECC | 帧校验 |
0xD01C | IN_INTF | INTF_SEL[2:0](3 DVP、2 MIPI、0 BT656) |
0xD020 | IN_DVP | VSYNC_POL bit0、HSYNC_POL bit1、INTERLACE bit2、FIELD bit3、YUV[5:4]、BT_SYNC bit10、BT_WIDTH bit11、MODE[16:15]、FMT[19:17]、RAW_ALIGN bit20、BUS[27:24]、IMG_CHK bit28、HCOMP bit31 |
0xD024 | IN_CSI_FMT | [5:0] |
0xD028 | IN_HOR_PARA0 | HACT[15:0]、HFB[31:16] |
0xD02C | IN_HOR_PARA1 | HBB[15:0] |
0xD030–0xD03C | IN_VER_PARA0..3 | 垂直参数,IN_VER_PARA3 为 VBLANK[31:0] |
0xD040 | BF_BAR_CTRL | COLOR_EN bit31、REPLACE_EN bit30、FRAME_INFINITE bit15、FRAME_NUM[14:0] |
0xD044 | BF_BAR_BLANK | HBLANK[31:16]、VBLANK[15:0] |
0xD050 | PCK_MASK | [15:0] |
0xD060 | VLD_LINE_SAV | 24 位 |
0xD064 | VLD_LINE_EAV | 24 位 |
0xD070 | VLD_FRM_SAV | 有效帧高,24 位 |
0xD074 | VLD_FRM_EAV | 有效帧宽,24 位 |
0xD080 | DVP_CLK_SEL | EDGE bit0 |
0xD08C | W_STATE | [6:0] |
0xD090 | VC_CONTROL_CH0_PIX | [15:0] |
0xD0A0 | VC_CONTROL_CH0_LINE | [15:0] |
0xD0C0–0xD0DC | COLOR_BAR[0..7] | Y[23:16]、CB[15:8]、CR[7:0] |
0xD0E0–0xD0FC | COLOR_BAR2[0..7] | 同上 |
0xD100 | MIPI_ALL_WIDTH_4BYTE | [15:0] |
0xD104 | MIPI_VCROP_DEL01 | [15:0] |
0xD10C | MIPI_SENSOR_CONTROL | FRAME[5:4]、START_DELAY[11:8]、DT[17:12]、DT_EN bit18、START_CH[21:20]、SYNC bit22、HCOMP bit23、VCOMP bit24 |
0xD110 | MIPI_HCROP_CH0 | START[15:0]、WIDTH[31:16] |
0xD1A4 | VC_CONTROL_DELAY | V[15:0]、H[31:16] |
0xD1A8 | VC_CONTROL_ROUTE | [2:0] |
0xD1B0 | VC_CONTROL_DELAY_BLK | [15:0] |
0xD1E0 | INT_STA | 中断状态(只读) |
0xD1E4 | INT_STATU2 | 第二组中断状态(只读),SDK 结构体里叫 reserved_12 |
0xD1E8 | INT_MASK | 中断屏蔽,1 = 屏蔽 |
0xD1EC | INT_MASK2 | 第二组中断屏蔽,SDK 结构体里叫 reserved_13 |
0xD1F0 | INT_CLR | 写 1 清除 |
0xD1F4 | INT_CLR2 | 第二组中断清除,写 1 清除,SDK 结构体里叫 reserved_14 |
补充说明:
INT_STA是只读寄存器,没有软件注入路径;位只能由真实链路事件置起,写INT_CLR清除。因此想验证某一位的中断行为,只能用真实的 DVP/MIPI 数据流, 或者用 LL 去改能让该位发生的配置(见第 9.4 节)。第二组中断字(
0x1E4/0x1EC/0x1F4)只在寄存器手册里有名字,SDK 的vic_regs.h里对应字段是reserved_12/13/14,HAL/LL 都没有封装。要访问只能 自己按偏移读写,且先确认手册与芯片一致。掩码极性:
INT_MASK写 1 表示屏蔽、写 0 表示放行;寄存器复位值是0(全放行)。 HAL 的默认值另有一套:DVP/BT656 是FRAME_START | FRAME_RESET;MIPI 是0xFFFFF & ~(FRAME_DONE | 各错误位),帧开始/帧复位在 MIPI 下默认是屏蔽的。MIPI 下
FRAME_RESET(bit8)可能一直挂着不清,若把它一起放行会形成电平中断活锁。 排查 MIPI 中断时不要“全放行”当第一步。
3.9 错误码速查
| 场景 | 推荐关注错误码 | 说明 |
|---|---|---|
| 任意 HAL 调用 | IM_ERR_INVALID_PARAM | 指针为空、实例不是 ISP0/ISP1 或字段越界 |
*_regs_dump | IM_ERR_UNSUPPORTED | 调试辅助未编译,属于预期行为 |
补充说明:CONFIG_SDK_HAL_PARAM_CHECK=n 时上表中所有 IM_ERR_INVALID_PARAM 都不会再
返回——非法参数会直接写进寄存器。产品里不要靠“HAL 会挡一下”来保证正确性。
4. 示例程序解读
4.1 用例三:vic_int
它回答什么问题:VIC 的 11 个中断位能不能各自把 CPU 叫起来、能不能被INT_CLR 清掉。
前提:VIC 没有软件注入路径
/* vic_regs.h: int_sta is __I (read-only); int_clr is __O (write-1-to-clear). */
所以“造一次中断”只能让真实链路事件把状态位置起来。用例因此拆成两部分:
Part 1(寄存器级,
camera_open()之后 /camera_start()之前):INT_MASK/INT_MASK2整字写读、第二组中断字的地址译码探测、INT_CLR的 W1C 语义。这一段的顺序本身就是判据——窗口没打开时所有读回都是同一个常数,判据会 被静默放行。所以 Part 1 必须排在camera_open()之后。Part 2(真实链路,逐位扫描):每次只放开一位、其余全屏蔽,跑一个有界窗口, 统计 CPU 进入次数与
INT_STA实际置起的位。
逐位而不是全开的两个理由
bit8
FRAME_RST在 MIPI 上可能常置,全开等于让 VIC 一直拉着 PLIC,形成电平 中断活锁;只有逐位才能把“哪一位把 CPU 叫来了”归因清楚。
calls 的绝对值没有意义
VIC 与 RESP 共用一条 IRQ,camera_irq_handler() 同时服务两者。全屏蔽那一档calls 不会归零——RESP 的 GPL_WDMA_DONE 每帧都在发。判“CPU 响应了 VIC 这一位”
只能看扣除 RESP 分量后的增量。
第二组中断字
#define VIC_INT_OFF_INT_STA2 (0x01E4U) /* manual: INT_STATU2, SDK: reserved_12 */ #define VIC_INT_OFF_INT_MASK2 (0x01ECU) /* manual: INT_MASK2, SDK: reserved_13 */ #define VIC_INT_OFF_INT_CLR2 (0x01F4U) /* manual: INT_CLR2, SDK: reserved_14 */
SDK 结构体里这三个地址是保留字段,HAL/LL 都没有封装。用例会对它们做译码探测:
用 SOFT_VERSION/HARD_VERSION 作为“确实能读到”的正例,用未定义地址 0x108作为“读到的不是有效寄存器”的负例。结论以自己板上的打印为准。
用 LL 注入异常的例子
对造不出事件的位(水平/垂直比较错误、FIFO 溢出等),用例在 Part 2b 里用 LL 把
比较阈值改错,看 INT_STA 会不会置起来:
ll_vic_mipi_sync_set(ispx, value); ll_vic_mipi_hcrop_all_width_set(ispx, value); ll_vic_mipi_hcrop_start_pixel_set(ispx, value); ll_vic_mipi_vcrop_set(ispx, value); ll_vic_hact_set(ispx, value);
改完必须用 camera_stop() / camera_start() 重起一次流,否则 VIC 不会重新加载
这些配置。注意:Part 2b 只用于观察,不作为判据——位没置起来只说明这种注入方式
没有造出事件,不算失败。另有两条物理注入(停 TOP 管线造 FIFO 溢出、半帧断流造 bit8)默认关闭,
其中半帧断流会让 camera_start() 的 VIC 复位握手卡死,不要在生产流程里模仿。