API GUIDE / IPU / LL
G32S10 IPU LL 接口
LL 层接口:LL 接口均为 static inline,直接读写寄存器,不做参数保护;调用方必须保证 ipux 合法、掩码/枚举在有效范围内。
1. LL 与基础辅助接口规范
LL 接口均为 static inline,直接读写寄存器,不做参数保护;调用方必须保证ipux 合法、掩码/枚举在有效范围内。
1.1 实例与状态读取
1.1.1 ll_ipu_is_instance
bool ll_ipu_is_instance(const ipu_regs_t *ipux);
功能说明:
判断指针是否为已知 IPU 实例(ipux == IPU)。
1.1.2 ll_ipu_get_frame_control
uint32_t ll_ipu_get_frame_control(const ipu_regs_t *ipux);
功能说明:
读取帧控制寄存器(IPU_FM_CONTROL 0x000)。
1.1.3 ll_ipu_is_chip_enabled
bool ll_ipu_is_chip_enabled(const ipu_regs_t *ipux);
功能说明:
检查 IPU_FM_CONTROL.CHIP_EN(0x000)是否置位。spec 说明该位复位后恒为 1,
写入无效。
1.1.4 ll_ipu_get_status
uint32_t ll_ipu_get_status(const ipu_regs_t *ipux);
功能说明:
读取状态寄存器(IPU_STATUS 0x004)。
1.1.5 ll_ipu_status_get_id
uint32_t ll_ipu_status_get_id(uint32_t status);
功能说明:
从状态快照读取版本 ID 字段(IPU_STATUS.ID 0x004)。
1.1.6 ll_ipu_status_get_main_state
uint32_t ll_ipu_status_get_main_state(uint32_t status);
功能说明:
从状态快照读取主状态字段(IPU_STATUS.MSTATUS 0x004)。
1.1.7 ll_ipu_status_is_idle
bool ll_ipu_status_is_idle(uint32_t status);
功能说明:
判断状态快照是否报告 idle(MSTATUS == IPU_STATUS_MSTATUS_IDLE)。
1.1.8 ll_ipu_is_idle
bool ll_ipu_is_idle(const ipu_regs_t *ipux);
功能说明: 直接读取寄存器判断控制器是否 idle。
1.1.9 ll_ipu_status_has_size_error
bool ll_ipu_status_has_size_error(uint32_t status);
功能说明:
判断状态快照是否报告尺寸错误(IPU_STATUS.SIZE_ERR 0x004)。
1.1.10 ll_ipu_status_has_output_end
bool ll_ipu_status_has_output_end(uint32_t status);
功能说明:
判断状态快照是否报告帧输出完成(IPU_STATUS.OUT_END 0x004)。
1.1.11 ll_ipu_clear_output_end
void ll_ipu_clear_output_end(ipu_regs_t *ipux);
功能说明:
清除帧输出完成标志(W1C)。实现先读 IPU_STATUS 再写清除值,避免把同寄存器的
只读字段(ID、MSTATUS)写回去。
1.2 格式、地址与几何
1.2.1 ll_ipu_set_output_format
void ll_ipu_set_output_format(ipu_regs_t *ipux, uint32_t output_format, uint32_t argb_order);
功能说明:
写输出数据格式与字节序(IPU_D_FMT 0x008)。output_format 使用IPU_OUTPUT_FORMAT_*,argb_order 使用 IPU_ARGB_ORDER_*。
1.2.2 ll_ipu_get_output_format
uint32_t ll_ipu_get_output_format(const ipu_regs_t *ipux);
功能说明:
读输出数据格式寄存器(IPU_D_FMT 0x008)。
1.2.3 ll_ipu_set_source_addresses
void ll_ipu_set_source_addresses(ipu_regs_t *ipux, uint32_t y_addr, uint32_t uv_addr);
功能说明:
写背景/源地址(IPU_Y_ADDR 0x00C、IPU_UV_ADDR 0x010),要求 8 字节对齐。
1.2.4 ll_ipu_set_source_ping_pong_addresses
void ll_ipu_set_source_ping_pong_addresses(ipu_regs_t *ipux, uint32_t y_addr_pp, uint32_t uv_addr_pp);
功能说明:
写乒乓背景/源地址(IPU_Y_ADDR_PP 0x1C0、IPU_UV_ADDR_PP 0x1C4),仅连续
模式需要。
1.2.5 ll_ipu_set_input_size
void ll_ipu_set_input_size(ipu_regs_t *ipux, uint32_t width, uint32_t height);
功能说明:
写输入宽高(IPU_IN_FM_GS 0x018),范围 4~1280。
1.2.6 ll_ipu_get_input_size
uint32_t ll_ipu_get_input_size(const ipu_regs_t *ipux);
功能说明:
读输入几何寄存器(IPU_IN_FM_GS 0x018)。
1.2.7 ll_ipu_set_source_strides
void ll_ipu_set_source_strides(ipu_regs_t *ipux, uint32_t y_stride, uint32_t uv_stride);
功能说明:
写背景/源跨距(IPU_Y_STRIDE 0x01C、IPU_UV_STRIDE 0x020),要求 8 字节对齐。
1.2.8 ll_ipu_set_output_addresses
void ll_ipu_set_output_addresses(ipu_regs_t *ipux, uint32_t out_addr, uint32_t uv_out_addr, uint32_t out_v_addr);
功能说明:
写输出地址(IPU_OUT_ADDR 0x024、IPU_UV_OUT_ADDR 0x0B4、IPU_OUT_V_ADDR0x030),仅 PSRAM 输出需要。
1.2.9 ll_ipu_set_output_strides
void ll_ipu_set_output_strides(ipu_regs_t *ipux, uint32_t out_stride, uint32_t uv_out_stride, uint32_t out_v_stride);
功能说明:
写输出跨距(IPU_OUT_STRIDE 0x02C、IPU_UV_OUT_STRIDE 0x0B8、IPU_OUT_V_STRIDE 0x034),仅 PSRAM 输出需要。
1.2.10 ll_ipu_get_output_stride
uint32_t ll_ipu_get_output_stride(const ipu_regs_t *ipux);
功能说明:
读输出 Y/S/packed 跨距寄存器(IPU_OUT_STRIDE 0x02C)。
1.2.11 ll_ipu_get_uv_output_stride
uint32_t ll_ipu_get_uv_output_stride(const ipu_regs_t *ipux);
功能说明:
读输出 UV/H 跨距寄存器(IPU_UV_OUT_STRIDE 0x0B8)。
1.2.12 ll_ipu_get_output_v_stride
uint32_t ll_ipu_get_output_v_stride(const ipu_regs_t *ipux);
功能说明:
读输出 V 跨距寄存器(IPU_OUT_V_STRIDE 0x034)。
1.3 寄存器重配置与触发控制
1.3.1 ll_ipu_set_ready_mask
void ll_ipu_set_ready_mask(ipu_regs_t *ipux, uint32_t ready_mask);
功能说明: 置位全部 ready 位使新配置生效。
1.3.2 ll_ipu_enable_ready_mask
void ll_ipu_enable_ready_mask(ipu_regs_t *ipux, uint32_t ready_mask);
功能说明:
按位或置位 IPU_REG_CTRL(0x064)ready 位。
1.3.3 ll_ipu_get_ready_mask
uint32_t ll_ipu_get_ready_mask(const ipu_regs_t *ipux);
功能说明:
读 IPU_REG_CTRL(0x064)ready 位。
1.3.4 ll_ipu_set_trigger_config
void ll_ipu_set_trigger_config(ipu_regs_t *ipux, uint32_t refresh_mode, uint32_t output_route, uint32_t debug_select);
功能说明:
写刷新模式、输出路由与 debug select(IPU_TRIGGER 0x074),保留 RUN 位。refresh_mode 使用 IPU_REFRESH_MODE_*,output_route 使用IPU_OUTPUT_ROUTE_*。
1.3.5 ll_ipu_get_trigger
uint32_t ll_ipu_get_trigger(const ipu_regs_t *ipux);
功能说明:
读触发寄存器(IPU_TRIGGER 0x074)。
1.3.6 ll_ipu_start
void ll_ipu_start(ipu_regs_t *ipux);
功能说明:
置位 IPU_TRIGGER.RUN(0x074)。
1.3.7 ll_ipu_stop
void ll_ipu_stop(ipu_regs_t *ipux);
功能说明:
置位 IPU_TRIGGER.STOP(0x074)请求停止;是否完成由调用方读 MSTATUS 确认。
1.3.8 ll_ipu_reset
void ll_ipu_reset(ipu_regs_t *ipux);
功能说明:
置位 IPU_TRIGGER.RESET(0x074)复位控制器。
1.4 中断使能
1.4.1 ll_ipu_interrupt_enable
void ll_ipu_interrupt_enable(ipu_regs_t *ipux);
功能说明:
使能 IPU 中断(IPU_GLB_CTRL 0x07C)。
1.4.2 ll_ipu_interrupt_disable
void ll_ipu_interrupt_disable(ipu_regs_t *ipux);
功能说明:
关闭 IPU 中断(IPU_GLB_CTRL 0x07C)。
1.4.3 ll_ipu_is_interrupt_enabled
bool ll_ipu_is_interrupt_enabled(const ipu_regs_t *ipux);
功能说明:
读中断使能状态(IPU_GLB_CTRL 0x07C)。
1.5 OSD 配置
1.5.1 ll_ipu_set_osd_ch0_addresses
void ll_ipu_set_osd_ch0_addresses(ipu_regs_t *ipux, uint32_t y_addr, uint32_t uv_addr);
功能说明:
写 OSD 通道 0 地址(IPU_OSD_CH0_Y_ADDR 0x0BC、IPU_OSD_CH0_UV_ADDR 0x0C4),
要求 8 字节对齐。
1.5.2 ll_ipu_set_osd_ch0_ping_pong_addresses
void ll_ipu_set_osd_ch0_ping_pong_addresses(ipu_regs_t *ipux, uint32_t y_addr_pp, uint32_t uv_addr_pp);
功能说明:
写 OSD 通道 0 乒乓地址(IPU_OSD_CH0_Y_ADDR_PP 0x1C8、IPU_OSD_CH0_UV_ADDR_PP 0x1CC),仅连续模式需要。
1.5.3 ll_ipu_set_osd_ch0_strides
void ll_ipu_set_osd_ch0_strides(ipu_regs_t *ipux, uint32_t y_stride, uint32_t uv_stride);
功能说明:
写 OSD 通道 0 跨距(IPU_OSD_CH0_Y_STRIDE 0x0C0、IPU_OSD_CH0_UV_STRIDE0x0C8),要求 8 字节对齐。
1.5.4 ll_ipu_set_osd_ch0_size
void ll_ipu_set_osd_ch0_size(ipu_regs_t *ipux, uint32_t width, uint32_t height);
功能说明:
写 OSD 通道 0 宽高(IPU_OSD_CH0_GS 0x0FC)。width 为行像素数(NV12/NV21/
2-bit)或像素数乘 4(ARGB/RGB,见 ipu_ch0_width_bytes)。通道 0 尺寸必须小于
背景图像。
1.5.5 ll_ipu_set_osd_ch0_position
void ll_ipu_set_osd_ch0_position(ipu_regs_t *ipux, uint32_t x_pos, uint32_t y_pos);
功能说明:
写 OSD 通道 0 在背景中的位置(IPU_OSD_CH0_POS 0x10C)。
1.5.6 ll_ipu_set_osd_ch0_parameter
void ll_ipu_set_osd_ch0_parameter(ipu_regs_t *ipux, uint32_t parameter);
功能说明:
写 OSD 通道 0 参数寄存器原始值(IPU_OSD_CH0_PARA 0x11C),按 VALID_MASK掩码。
1.5.7 ll_ipu_get_osd_ch0_parameter
uint32_t ll_ipu_get_osd_ch0_parameter(const ipu_regs_t *ipux);
功能说明:
读 OSD 通道 0 参数寄存器(IPU_OSD_CH0_PARA 0x11C)。
1.5.8 ll_ipu_set_osd_ch0_mask_color
void ll_ipu_set_osd_ch0_mask_color(ipu_regs_t *ipux, uint32_t argb_value);
功能说明:
写 OSD 通道 0 mask ARGB/AYUV 值(IPU_OSD_CH0_BAK_ARGB 0x130)。
1.5.9 ll_ipu_set_osd_background_parameter
void ll_ipu_set_osd_background_parameter(ipu_regs_t *ipux, uint32_t parameter);
功能说明:
写 OSD 背景参数寄存器原始值(IPU_OSD_CH_BK_PARA 0x12C),按 VALID_MASK掩码。
1.5.10 ll_ipu_get_osd_background_parameter
uint32_t ll_ipu_get_osd_background_parameter(const ipu_regs_t *ipux);
功能说明:
读 OSD 背景参数寄存器(IPU_OSD_CH_BK_PARA 0x12C)。
1.5.11 ll_ipu_set_osd_background_mask_color
void ll_ipu_set_osd_background_mask_color(ipu_regs_t *ipux, uint32_t ayuv_value);
功能说明:
写 OSD 背景 mask AYUV 值(IPU_OSD_CH_B_BAK_ARGB 0x140)。
1.5.12 ll_ipu_set_osd_padding_color
void ll_ipu_set_osd_padding_color(ipu_regs_t *ipux, uint32_t argb_value);
功能说明:
写 OSD 层 padding ARGB/AYUV 值(IPU_OSD_LAY_PADDING_ARGB 0x1B0)。
1.6 CSC 与读仲裁
1.6.1 ll_ipu_set_csc_coefficients
void ll_ipu_set_csc_coefficients(ipu_regs_t *ipux, const ll_ipu_csc_coefficients_t *coefficients);
功能说明:
写通道 0 CSC 系数与偏移(IPU_CH0_CSC_C0~C4_COEF 0x148~0x158、IPU_CH0_CSC_OFFSET_PARA 0x15C)。
1.6.2 ll_ipu_set_read_arbiter
void ll_ipu_set_read_arbiter(ipu_regs_t *ipux, uint32_t mode, uint32_t ch0_priority, uint32_t ch1_priority);
功能说明:
写读仲裁模式与通道优先级(IPU_RD_ARB_CTL 0x1A8)。固定优先级模式下两个
优先级必须不同。
1.7 连续帧状态与诊断
1.7.1 ll_ipu_set_buffer_state
void ll_ipu_set_buffer_state(ipu_regs_t *ipux, uint32_t buffer_state);
功能说明:
整体写 IPU_BUFF_STATE(0x1D0)ready 位(连续模式由软件管理)。
1.7.2 ll_ipu_enable_buffer_state
void ll_ipu_enable_buffer_state(ipu_regs_t *ipux, uint32_t buffer_mask);
功能说明:
置位选定 IPU_BUFF_STATE(0x1D0)ready 位。
1.7.3 ll_ipu_disable_buffer_state
void ll_ipu_disable_buffer_state(ipu_regs_t *ipux, uint32_t buffer_mask);
功能说明:
清除选定 IPU_BUFF_STATE(0x1D0)ready 位。
1.7.4 ll_ipu_get_buffer_state
uint32_t ll_ipu_get_buffer_state(const ipu_regs_t *ipux);
功能说明:
读 IPU_BUFF_STATE(0x1D0)ready 位。
1.7.5 ll_ipu_get_frame_cycle_count
uint32_t ll_ipu_get_frame_cycle_count(const ipu_regs_t *ipux);
功能说明:
读最近一帧 cycle count(IPU_CYC_NUM_ONE_FRA 0x1AC)。
1.7.6 ll_ipu_get_debug_info
uint32_t ll_ipu_get_debug_info(const ipu_regs_t *ipux);
功能说明:
读 debug 信号快照(IPU_DEBUG_INFO_SIGNALS 0x1B4)。
1.8 2-bit 模式
1.8.1 ll_ipu_write_2bit_one_value
void ll_ipu_write_2bit_one_value(ipu_regs_t *ipux, uint32_t value);
功能说明:
写数据位为 1 时的 2-bit 值(IPU_2BIT_BIT_1 0x1F4)。
1.8.2 ll_ipu_get_2bit_one_value
uint32_t ll_ipu_get_2bit_one_value(const ipu_regs_t *ipux);
功能说明:
读 IPU_2BIT_BIT_1(0x1F4)。
1.8.3 ll_ipu_write_2bit_zero_value
void ll_ipu_write_2bit_zero_value(ipu_regs_t *ipux, uint32_t value);
功能说明:
写数据位为 0 时的 2-bit 值(IPU_2BIT_BIT_0 0x1F8)。
1.8.4 ll_ipu_get_2bit_zero_value
uint32_t ll_ipu_get_2bit_zero_value(const ipu_regs_t *ipux);
功能说明:
读 IPU_2BIT_BIT_0(0x1F8)。
1.8.5 ll_ipu_write_2bit_mask
void ll_ipu_write_2bit_mask(ipu_regs_t *ipux, uint32_t mask);
功能说明:
写 2-bit mask(IPU_2BIT_MASK 0x1FC)。
1.8.6 ll_ipu_get_2bit_mask
uint32_t ll_ipu_get_2bit_mask(const ipu_regs_t *ipux);
功能说明:
读 2-bit mask(IPU_2BIT_MASK 0x1FC)。
1.8.7 ll_ipu_is_2bit_mask_enabled
bool ll_ipu_is_2bit_mask_enabled(const ipu_regs_t *ipux);
功能说明:
检查 2-bit mask 使能位(IPU_2BIT_MASK.MASK_EN 0x1FC)。
2. 寄存器映射与位域约定
2.1 寄存器映射
ipu_regs_t 覆盖 IPU 寄存器空间,主要寄存器如下(完整位域见 ipu_regs.h):
| 寄存器字段 | 偏移 | 说明 |
|---|---|---|
fm_control | 0x000 | Frame control;CHIP_EN 复位后恒 1。 |
status | 0x004 | ID、MSTATUS、SIZE_ERR、OUT_END。 |
data_format | 0x008 | 输出格式与 ARGB 字节序。 |
y_addr / uv_addr | 0x00C / 0x010 | 背景/源地址。 |
input_size | 0x018 | 输入宽高。 |
y_stride / uv_stride | 0x01C / 0x020 | 源跨距。 |
out_addr / uv_out_addr / out_v_addr | 0x024 / 0x0B4 / 0x030 | PSRAM 输出地址。 |
out_stride / uv_out_stride / out_v_stride | 0x02C / 0x0B8 / 0x034 | PSRAM 输出跨距。 |
reg_ctrl | 0x064 | 寄存器重配置 ready 控制。 |
trigger | 0x074 | RUN/STOP/RESET、REFRESH_MODE、DPU_EN、DEBUG_SEL。 |
global_ctrl | 0x07C | IPU 中断使能。 |
osd_ch0_y_addr / osd_ch0_y_stride | 0x0BC / 0x0C0 | OSD 通道 0 Y 地址/跨距。 |
osd_ch0_uv_addr / osd_ch0_uv_stride | 0x0C4 / 0x0C8 | OSD 通道 0 UV 地址/跨距。 |
osd_ch0_size | 0x0FC | OSD 通道 0 宽高。 |
osd_ch0_pos | 0x10C | OSD 通道 0 位置。 |
osd_ch0_para | 0x11C | OSD 通道 0 控制参数。 |
osd_ch_bk_para | 0x12C | OSD 背景参数。 |
osd_ch0_bak_argb | 0x130 | OSD 通道 0 mask ARGB/AYUV。 |
osd_ch_b_bak_argb | 0x140 | OSD 背景 mask AYUV。 |
ch0_csc_c0_coef~`ch0_csc_c4_coef` | 0x148~`0x158` | 通道 0 CSC 系数。 |
ch0_csc_offset_para | 0x15C | 通道 0 CSC 亮度/色度偏移。 |
rd_arb_ctl | 0x1A8 | 读仲裁模式与优先级。 |
cyc_num_one_fra | 0x1AC | 最近一帧 cycle count(只读)。 |
osd_lay_padding_argb | 0x1B0 | OSD 层 padding 颜色。 |
debug_info_signals | 0x1B4 | Debug 信号快照(只读)。 |
y_addr_pp / uv_addr_pp | 0x1C0 / 0x1C4 | 乒乓背景地址。 |
osd_ch0_y_addr_pp / osd_ch0_uv_addr_pp | 0x1C8 / 0x1CC | 乒乓通道 0 地址。 |
buffer_state | 0x1D0 | 乒乓 buffer ready 状态。 |
two_bit_bit_1 / two_bit_bit_0 / two_bit_mask | 0x1F4 / 0x1F8 / 0x1FC | 2-bit 模式控制。 |
2.2 关键位域约定
IPU_STATUS(0x004):OUT_END为写 1 清除(W1C);ID/MSTATUS为只读, 清除时必须避免写回(见ll_ipu_clear_output_end)。IPU_TRIGGER(0x074):RUN/STOP/RESET为触发位;REFRESH_MODE选择 单帧/连续;DPU_EN选择 PSRAM/DPU 输出路由。IPU_REG_CTRL(0x064):shadow register ready 位;配置写完后置位使新配置 生效。IPU_BUFF_STATE(0x1D0):连续模式下的 buffer ready 位,由软件管理;BK_BUFF0_STATE与CH0_BUFF0_STATE配对表示第 0 组,BK_BUFF1_STATE与CH0_BUFF1_STATE配对表示第 1 组。孤立 ready 位会使 IPU 循环该 buffer。IPU_OSD_CH0_PARA(0x11C):CH0_EN、CSC_CTL、ALPHA_SEL、GLO_A、PIC_TYPE、ARGB_TYPE、PREM、OSDM、MASK_EN、PAD_SEL、OSD_SEL。IPU_RD_ARB_CTL(0x1A8):ARB_MODE、CH0_PRIO、CH1_PRIO;固定优先级 模式下两通道优先级必须不同。