API GUIDE / VIC / LL

G32S10 VIC LL 接口

LL 层接口:实例宏定义(isp_regs.h):

1. 资源模型

1.1 实例与基地址

HAL 端口实例宏基地址IRQ子模块
ISP0ISP00x13350000IRQ_ISP0 = IRQ_PLIC0_START + 19TOP/AE/IPC/DMSC/WDMA/RESP/VIC
ISP1ISP10x13360000IRQ_ISP1 = IRQ_PLIC0_START + 18TOP/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/getSAV/EAV 检查掩码
ll_vic_dvp_fmt_set/getDVP 数据格式
ll_vic_dvp_yuv_set/getYUV 字节序
ll_vic_dvp_mode_set/getDVP 时序模式
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/getRAW 对齐;低位模式映射 RAW8[7:0]/RAW10[9:0]/RAW12[11:0],高位模式映射 RAW8[11:4]/RAW10[11:2]/RAW12[11:0]
ll_vic_dvp_bus_set/getYUV422 8-bit 总线选择
ll_vic_dvp_img_check_enable/disable/enabledDVP 图像尺寸检查
ll_vic_hfb_set/get、ll_vic_hbb_set/get、ll_vic_dvp_vblank_set/get水平前/后消隐与垂直消隐
ll_vic_bf_colorbar_enable/disable/enabledBF 彩条总使能
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/getPCLK 采样沿
ll_vic_vld_line_sav_set/get、ll_vic_vld_line_eav_set/getSony 行 SAV/EAV 码
ll_vic_dvp_hcomp_enable/disable/enabledDVP 水平比较
ll_vic_bt_width_set/getBT656 总线宽度
ll_vic_bt_sync_set/getBT656 SAV/EAV 顺序
ll_vic_mipi_fmt_set/getMIPI 像素格式
ll_vic_mipi_width4_set/getMIPI 4 字节字宽
ll_vic_mipi_hcrop_all_width_set/getMIPI 裁剪前总宽
ll_vic_mipi_hcrop_start_pixel_set/getMIPI 水平裁剪起点
ll_vic_mipi_vcrop_set/getMIPI 垂直裁剪起点
ll_vic_mipi_vcomp_enable/disable/enabled、ll_vic_mipi_hcomp_enable/disable/enabledMIPI 垂直/水平比较
ll_vic_mipi_sync_set/getMIPI 同步模式
ll_vic_mipi_dt_check_enable/disable/enabledMIPI 数据类型检查
ll_vic_mipi_dt_set/getMIPI 数据类型
ll_vic_mipi_start_delay_set/getMIPI 启动延迟(Sony 传感器用 1,其余用 0)
ll_vic_mipi_start_ch_set/getMIPI 启动通道(正常为 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_enabledDMSC 旁路
ll_isp_top_enable/disable_raw_test_pattern、ll_isp_top_is_raw_test_pattern_enabledRAW 测试图(is_* 在硬件位为 0 时返回真)
ll_isp_top_enable/disable_rgb_test_pattern、ll_isp_top_is_rgb_test_pattern_enabledRGB 测试图
ll_isp_top_enable/disable_yuv_test_pattern、ll_isp_top_is_yuv_test_pattern_enabledYUV 测试图
ll_isp_top_select_dmsc_shadow_register_write、ll_isp_top_select_dmsc_pre_shadow_register_write、ll_isp_top_get_dmsc_shadow_write_selectDMSC 影子/预影子写选择
ll_isp_top_enable/disable_ae_statistics、ll_isp_top_is_ae_statistics_enabledAE 统计使能
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_spaceIPC/普通行间距
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_clearCOMMON_0 读清除模式
ll_isp_resp_enable/disable/is_unusual0_read_clearUNUSUAL_0 读清除模式
ll_isp_resp_enable/disable/is_backup0_read_clearBACKUP_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_maskCOMMON_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_maskUNUSUAL_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_maskBACKUP_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_enabledDUMP_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_limitY DMA 优先级
ll_isp_wdma_set/get_chroma_priority_level、ll_isp_wdma_set/get_chroma_priority_limitUV 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_modeUV 分辨率模式
ll_isp_dmsc_set/get_r_offset、ll_isp_dmsc_set/get_g_offset、ll_isp_dmsc_set/get_b_offsetRGB 偏移
ll_isp_dmsc_set/get_matrix_00 ~ matrix_223×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_countFIFO 已用/空闲项数
ll_isp_dmsc_get_transfer_state输出状态机
ll_isp_dmsc_is_fifo_underflow、is_fifo_overflow、is_fifo_empty、is_fifo_fullFIFO 标志
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_baseDMA 基址(带索引参数)
ll_isp_ae_set/get_statistics_dma_number、set/get_histogram_dma_numberDMA 缓冲数(硬件为 count−1)
ll_isp_ae_enable/disable/is_statistics_dma_monitor、enable/disable/is_histogram_dma_monitorDMA 监视
ll_isp_ae_enable/disable/is_interrupt_improve_drop中断期间丢帧
ll_isp_ae_set/get_statistics_dma_priority、set/get_histogram_dma_priorityDMA 优先级
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_mismatchedDMA 状态
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_backpressureRAM 忙反压

补充说明:分区尺寸 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 的成员与偏移:

成员类型偏移
topisp_top_regs_t0x0000
aeisp_ae_regs_t0x2000
ipcisp_ipc_regs_t0x3000
dmscisp_dmsc_regs_t0x4000
wdmaisp_wdma_regs_t0x9000
respisp_resp_regs_t0xA000
vicvic_regs_t0xD000

3.2 TOP

偏移名称字段
0x0000VERSION版本
0x0020CONSHD_SEL bit12
0x0024RSTFUN_RST bit2
0x0040BYPASSDMSC_BYPASS bit9
0x0044BYPASS1TPRAW bit0、TPRGB bit1、TPYUV bit2(0 = 启用测试图)
0x0048REG_CONDMSC_WRITE_SEL bit9
0x0060STATIC_ENbit0 AE 统计、bit1 直方图
0x0064STATIC_STOPbit0 AE、bit1 直方图
0x0068STATIC_RSTbit0
0x006CSTATIC_POS[2:0]
0x0080FRM_SIZEHEIGHT[15:0]、WIDTH[31:16]
0x0088BAYER_TYPEBAYER[4:0]、DATA_TYPE[9:8]
0x0090LINE_SPACE_0IPC[15:0]、NML[31:16]
0x0100STOP_CONbit0
0x0104STOP_STATE只读
0x0320SHD_TEST_CTRLbit0
0x0330OVERFLOW_STOP_ENbit0

3.3 IPC

偏移名称字段
0x3000SOFT_VERSION软件版本
0x3004HARD_VERSION硬件版本
0x3020TRIGEbit0
0x3030OUT_NUM[4:0]
0x3034OUT_MAP32 位映射
0x3040RESTARTSIZE_ERR bit0、OVERFLOW bit4
0x3044TRIGE_SELCH0[2:0]、TRIGGER_MODE bit16
0x3050OFFSETY[8:0]、UV[24:16]

3.4 RESP

偏移名称字段
0xA000INT_CTRLCOMMON0_EN bit0、UNUSUAL0_EN bit4、BACKUP0_EN bit8、ALL_CLR bit16
0xA020COMMON0_INT_EN事件使能
0xA024COMMON0_INT_CLR写 1 清除
0xA028COMMON0_INT_STATE状态
0xA02CCOMMON0_INT_MASK1 = 允许上报 CPU
0xA060UNUSUAL0_INT_EN同上组结构
0xA064UNUSUAL0_INT_CLR
0xA068UNUSUAL0_INT_STATE
0xA06CUNUSUAL0_INT_MASK
0xA0A0BACKUP0_INT_EN同上组结构
0xA0A4BACKUP0_INT_CLR
0xA0A8BACKUP0_INT_STATE
0xA0ACBACKUP0_INT_MASK
0xA100BP_INFObit0 DMSC 输入、bit1 AE 输入、bit2 WDMA 输入
0xA200POSITION_INFO[0]HCNT[15:0]、VCNT[31:16]
0xA204POSITION_INFO[1]同上
0xA208POSITION_INFO[2]同上

事件位:

组位事件
COMMON_02AE 统计完成
COMMON_03AE 直方图完成
COMMON_016STOP
COMMON_020GPL_WDMA 完成
COMMON_026IPC 帧开始
COMMON_027IPC 帧完成
COMMON_028IPC 通道 0 开始
COMMON_030IPC 通道 0 结束
UNUSUAL_02IPC 尺寸错误
UNUSUAL_03IPC 溢出
UNUSUAL_06AE 错误
UNUSUAL_07AE 直方图错误
BACKUP_09DMSC 帧完成
BACKUP_023AE 帧完成

3.5 GPL_WDMA

偏移名称字段
0x9000SOFT_VERSION软件版本
0x9004HARD_VERSION硬件版本
0x9044SOFT_RESETbit0
0x9054MUX_SELSOURCE[7:0]、TYPE[18:16]、ORDER[26:24]
0x9058START_ADDR[28:3](8 字节单位)
0x905CC_START_ADDR[28:3]
0x9060STRIDEY[15:3]、C[31:19]
0x9068DONE_ADDRY 完成地址原始值
0x906CC_DONE_ADDRUV 完成地址原始值
0x9070DUMP_ENbit0
0x9084EXT_PRIOY LEVEL[1:0]/LIMIT[12:4],C LEVEL[17:16]/LIMIT[28:20]
0x90C0DBG_00_00Y 地址 FIFO
0x90C4DBG_01_01UV 地址 FIFO
0x90C8DBG_02_02Y 结束地址 FIFO
0x90CCDBG_03_03UV 结束地址 FIFO

地址 FIFO 调试编码:bit0 = empty、bit4 = full、bits[10:8] = data 计数、 bits[14:12] = free 计数;深度 4。

3.6 DMSC

偏移名称字段
0x4000SOFT_VERSION软件版本
0x4004HARD_VERSION硬件版本
0x4040OUT_OPT[1:0]
0x404CIN_MODEINPUT_MODE bit0、RESMODE_UV[6:4]、R_OFFSET[24:16]
0x4050SUBG_OFFSET[8:0]、B_OFFSET[20:12]
0x4054PAR_0m00[8:0]、m01[19:10]、m02[27:20]
0x4058PAR_1m10[8:0]、m11[18:10]、m12[29:20]
0x405CPAR_2m20[9:0]、m21[19:10]、m22[28:20]
0x4060OFFSETY_OFFSET[7:0]、UV_OFFSET[15:8]
0x4064CLIP_MINMAXY_MIN[7:0]、Y_MAX[15:8]、UV_MIN[23:16]、UV_MAX[31:24]
0x4068DEBUG_0DATA_NUM[1:0]、FREE_NUM[17:16]
0x406CDEBUG_1TRANS_STATE[5:0]、UNDERFLOW bit8、OVERFLOW bit12、EMPTY bit16、FULL bit20、I_BP bit24

3.7 AE

偏移名称字段
0x2000SOFT_VERSION软件版本
0x2004HARD_VERSION硬件版本
0x2010SHD_CTRLbit0
0x2040ZONE_NUM_STARTV_START[11:0]、V_NUM[15:12]、H_START[27:16]、H_NUM[31:28]
0x2044HOR_ZONE_SIZE_144 个 8 位尺寸
0x2048HOR_ZONE_SIZE_584 个 8 位尺寸
0x204CHOR_ZONE_SIZE_9124 个 8 位尺寸
0x2050HOR_ZONE_SIZE_13153 个有效 8 位尺寸
0x2054VER_ZONE_SIZE_144 个 8 位尺寸
0x2058VER_ZONE_SIZE_584 个 8 位尺寸
0x205CVER_ZONE_SIZE_9124 个 8 位尺寸
0x2060VER_ZONE_SIZE_13153 个有效 8 位尺寸
0x2064LUM_TH_FREQDARK[7:0]、SAT[15:8]、HIST_FREQ[19:16]、STAT_FREQ[23:20]、HIST_READ bit24、HIST_TRIGGER bit28
0x2068–0x2074AE_DMA_BASE[0..3]统计 DMA 基址
0x2078–0x2084HIST_DMA_BASE[0..3]直方图 DMA 基址
0x2088DMA_BASE_NUMDMA_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
0x208CDMA_INFOHIST_CUR_BASE[1:0]、CUR_BASE[5:4]、FRAME_NUM[15:8]、DMA_STOP_ACK bit16、DMA_MISMATCH bit20、HIST_DMA_MISMATCH bit24
0x2090SPEC_ZONE_HSIZESTART[11:0]、END[27:16]
0x2094SPEC_ZONE_VSIZE同上
0x2098SPEC_FRAME_NUM_IN8 位帧号
0x209CSPEC_SUM_DARK28 位
0x20A0SPEC_SUM_MID28 位
0x20A4SPEC_SUM_SAT28 位
0x20A8SPEC_CNT_DARK20 位
0x20ACSPEC_CNT_SAT20 位
0x20B4SPEC_FRAME_NUM_OUT8 位帧号
0x20B8RAM_BUSY_ENbit0

3.8 VIC

偏移名称字段
0xD010CTRLSTART bit0、REG_EN bit1、RST bit2
0xD014RESV[15:0]、H[31:16]
0xD018FRM_ECC帧校验
0xD01CIN_INTFINTF_SEL[2:0](3 DVP、2 MIPI、0 BT656)
0xD020IN_DVPVSYNC_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
0xD024IN_CSI_FMT[5:0]
0xD028IN_HOR_PARA0HACT[15:0]、HFB[31:16]
0xD02CIN_HOR_PARA1HBB[15:0]
0xD030–0xD03CIN_VER_PARA0..3垂直参数,IN_VER_PARA3 为 VBLANK[31:0]
0xD040BF_BAR_CTRLCOLOR_EN bit31、REPLACE_EN bit30、FRAME_INFINITE bit15、FRAME_NUM[14:0]
0xD044BF_BAR_BLANKHBLANK[31:16]、VBLANK[15:0]
0xD050PCK_MASK[15:0]
0xD060VLD_LINE_SAV24 位
0xD064VLD_LINE_EAV24 位
0xD070VLD_FRM_SAV有效帧高,24 位
0xD074VLD_FRM_EAV有效帧宽,24 位
0xD080DVP_CLK_SELEDGE bit0
0xD08CW_STATE[6:0]
0xD090VC_CONTROL_CH0_PIX[15:0]
0xD0A0VC_CONTROL_CH0_LINE[15:0]
0xD0C0–0xD0DCCOLOR_BAR[0..7]Y[23:16]、CB[15:8]、CR[7:0]
0xD0E0–0xD0FCCOLOR_BAR2[0..7]同上
0xD100MIPI_ALL_WIDTH_4BYTE[15:0]
0xD104MIPI_VCROP_DEL01[15:0]
0xD10CMIPI_SENSOR_CONTROLFRAME[5:4]、START_DELAY[11:8]、DT[17:12]、DT_EN bit18、START_CH[21:20]、SYNC bit22、HCOMP bit23、VCOMP bit24
0xD110MIPI_HCROP_CH0START[15:0]、WIDTH[31:16]
0xD1A4VC_CONTROL_DELAYV[15:0]、H[31:16]
0xD1A8VC_CONTROL_ROUTE[2:0]
0xD1B0VC_CONTROL_DELAY_BLK[15:0]
0xD1E0INT_STA中断状态(只读)
0xD1E4INT_STATU2第二组中断状态(只读),SDK 结构体里叫 reserved_12
0xD1E8INT_MASK中断屏蔽,1 = 屏蔽
0xD1ECINT_MASK2第二组中断屏蔽,SDK 结构体里叫 reserved_13
0xD1F0INT_CLR写 1 清除
0xD1F4INT_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_dumpIM_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 实际置起的位。

逐位而不是全开的两个理由

  1. bit8 FRAME_RST 在 MIPI 上可能常置,全开等于让 VIC 一直拉着 PLIC,形成电平 中断活锁;

  2. 只有逐位才能把“哪一位把 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 复位握手卡死,不要在生产流程里模仿。