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_control0x000Frame control;CHIP_EN 复位后恒 1。
status0x004ID、MSTATUS、SIZE_ERR、OUT_END。
data_format0x008输出格式与 ARGB 字节序。
y_addr / uv_addr0x00C / 0x010背景/源地址。
input_size0x018输入宽高。
y_stride / uv_stride0x01C / 0x020源跨距。
out_addr / uv_out_addr / out_v_addr0x024 / 0x0B4 / 0x030PSRAM 输出地址。
out_stride / uv_out_stride / out_v_stride0x02C / 0x0B8 / 0x034PSRAM 输出跨距。
reg_ctrl0x064寄存器重配置 ready 控制。
trigger0x074RUN/STOP/RESET、REFRESH_MODE、DPU_EN、DEBUG_SEL。
global_ctrl0x07CIPU 中断使能。
osd_ch0_y_addr / osd_ch0_y_stride0x0BC / 0x0C0OSD 通道 0 Y 地址/跨距。
osd_ch0_uv_addr / osd_ch0_uv_stride0x0C4 / 0x0C8OSD 通道 0 UV 地址/跨距。
osd_ch0_size0x0FCOSD 通道 0 宽高。
osd_ch0_pos0x10COSD 通道 0 位置。
osd_ch0_para0x11COSD 通道 0 控制参数。
osd_ch_bk_para0x12COSD 背景参数。
osd_ch0_bak_argb0x130OSD 通道 0 mask ARGB/AYUV。
osd_ch_b_bak_argb0x140OSD 背景 mask AYUV。
ch0_csc_c0_coef~`ch0_csc_c4_coef`0x148~`0x158`通道 0 CSC 系数。
ch0_csc_offset_para0x15C通道 0 CSC 亮度/色度偏移。
rd_arb_ctl0x1A8读仲裁模式与优先级。
cyc_num_one_fra0x1AC最近一帧 cycle count(只读)。
osd_lay_padding_argb0x1B0OSD 层 padding 颜色。
debug_info_signals0x1B4Debug 信号快照(只读)。
y_addr_pp / uv_addr_pp0x1C0 / 0x1C4乒乓背景地址。
osd_ch0_y_addr_pp / osd_ch0_uv_addr_pp0x1C8 / 0x1CC乒乓通道 0 地址。
buffer_state0x1D0乒乓 buffer ready 状态。
two_bit_bit_1 / two_bit_bit_0 / two_bit_mask0x1F4 / 0x1F8 / 0x1FC2-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;固定优先级 模式下两通道优先级必须不同。