API GUIDE / AIC / LL

AIC LL 接口

1. LL 接口规范

1.1 LL 通用约束

LL 函数全部是 static inline 寄存器 helper:

  • 不校验 aic_regs_t * 是否为 AIC。
  • 不检查 AIC clock、stream state 或 BIT_CLK。
  • 不处理竞态和多线程。
  • 多个字段的 read-modify-write 不能与访问同一寄存器的 ISR 并发执行。

只应在 HAL 已建立正确状态后使用 LL 做诊断、寄存器快照或特殊流程。

1.2 AICFR helper

主要接口:

ll_aic_get_fr/set_fr
ll_aic_internal_codec_reset_assert/deassert
ll_aic_set_adc_to_dac_loop/set_normal_operation
ll_aic_set_rx_fifo_threshold/set_tx_fifo_threshold
ll_aic_get_tx_fifo_reset_status/get_rx_fifo_reset_status
ll_aic_set_big_endian/set_little_endian
ll_aic_set_six_wire_mode/set_four_wire_mode
ll_aic_select_internal_codec_tx/external_codec_tx
ll_aic_select_internal_codec_rx/external_codec_rx
ll_aic_set_underrun_last_sample/underrun_zero
ll_aic_select_audio_unit
ll_aic_reset_assert
ll_aic_set_tx_master/slave, set_rx_master/slave
ll_aic_enable/disable/is_enabled
ll_aic_is_tx_master/is_rx_master

AICFR.RST 是写 1 触发;完成后检查 RST_O_STATUS/RST_I_STATUS。

1.3 AICCR helper

主要分组:

分组 Helper
full register ll_aic_get_cr()、ll_aic_set_cr()
runtime disable ll_aic_disable_runtime_controls()
playback ll_aic_enable/disable_playback()
capture ll_aic_enable/disable_capture()
loop ll_aic_enable/disable_tx_fifo_loopback()
internal loopback ll_aic_enable/disable_loopback()
packed/channel set_packed_mode()、set_unpacked_mode()、set_channel_count()
sample size set_output_sample_size()、set_input_sample_size()
mono set_mono_capture()、enable/disable_mono_to_stereo()
conversion enable/disable_endian_swap()、enable/disable_sign_convert()
DMA enable/disable_tx_dma()、enable/disable_rx_dma()
loop DMA enable/disable_tx_loopback_dma()
flush flush_tx_fifo()、flush_rx_fifo()
IRQ 各方向的 enable/disable IRQ helper

1.4 I2SCR helper

ll_aic_get_i2s_cr/set_i2s_cr
ll_aic_set_i2s_mode/set_msb_justified_mode
ll_aic_set_i2s_left_first/right_first
ll_aic_enable/disable_i2s_lr_swap
ll_aic_set_i2s_first_channel_left

FIRSTCHN_LEFT 尽管在部分 SPEC 中标注为只读,当前 SoC 上必须置 1,否则部分 format/ rate 组合可能无法正常启动。

1.5 AICSR helper

ll_aic_get_sr
ll_aic_get_tx_fifo_level
ll_aic_get_rx_fifo_level
ll_aic_get_loop_fifo_level
ll_aic_get_tx_underrun/clear_tx_underrun
ll_aic_get_rx_overrun/clear_rx_overrun
ll_aic_get_loop_fifo_overrun/clear_loop_fifo_overrun
ll_aic_get_tx_fifo_service
ll_aic_get_rx_fifo_service
ll_aic_get_loop_fifo_service

Error bit 是 write-zero-to-clear。清除一个 bit 时必须保持其他 W0C bit 为 1,LL helper 已经按此规则实现。

1.6 I2SSR 和 I2SDIV

ll_aic_get_i2s_busy()
ll_aic_get_i2s_tx_busy()
ll_aic_get_i2s_rx_busy()
ll_aic_get_i2s_channel_busy()

ll_aic_set_i2s_idv(aicx, divider - 1U)
ll_aic_set_i2s_dv(aicx, divider - 1U)

IDV 和 DV 字段保存的都是 divider - 1。I2SDIV 的最终使用还取决于 AIC clock source 和 clock role。

1.7 Data/FIFO helper

ll_aic_write_data(aicx, data)
ll_aic_read_data(aicx)
ll_aic_read_loop_data(aicx)
ll_aic_set_loop_fifo_threshold(aicx, threshold)

ll_aic_read_data() 和 ll_aic_read_loop_data() 都会 pop 对应 FIFO entry。不要把它们 当作只读状态查询。

1.8 LL 完整符号索引

AICFR:

ll_aic_is_instance
ll_aic_get_fr
ll_aic_set_fr
ll_aic_internal_codec_reset_assert
ll_aic_internal_codec_reset_deassert
ll_aic_set_adc_to_dac_loop
ll_aic_set_normal_operation
ll_aic_set_rx_fifo_threshold
ll_aic_set_tx_fifo_threshold
ll_aic_get_tx_fifo_reset_status
ll_aic_get_rx_fifo_reset_status
ll_aic_set_big_endian
ll_aic_set_little_endian
ll_aic_set_six_wire_mode
ll_aic_set_four_wire_mode
ll_aic_select_internal_codec_tx
ll_aic_select_external_codec_tx
ll_aic_set_underrun_last_sample
ll_aic_set_underrun_zero
ll_aic_select_internal_codec_rx
ll_aic_select_external_codec_rx
ll_aic_select_audio_unit
ll_aic_reset_assert
ll_aic_set_tx_master
ll_aic_set_tx_slave
ll_aic_set_rx_master
ll_aic_set_rx_slave
ll_aic_enable
ll_aic_disable
ll_aic_is_enabled
ll_aic_is_tx_master
ll_aic_is_rx_master

AICCR:

ll_aic_get_cr
ll_aic_set_cr
ll_aic_disable_runtime_controls
ll_aic_enable_loop_fifo_overrun_irq
ll_aic_disable_loop_fifo_overrun_irq
ll_aic_enable_loop_fifo_service_irq
ll_aic_disable_loop_fifo_service_irq
ll_aic_get_en2old
ll_aic_clear_en2old
ll_aic_set_packed_mode
ll_aic_set_unpacked_mode
ll_aic_enable_echo_cancellation
ll_aic_disable_echo_cancellation
ll_aic_set_channel_count
ll_aic_enable_tx_fifo_loopback
ll_aic_disable_tx_fifo_loopback
ll_aic_enable_tx_loopback_dma
ll_aic_disable_tx_loopback_dma
ll_aic_set_output_sample_size
ll_aic_set_input_sample_size
ll_aic_enable_rx_dma
ll_aic_disable_rx_dma
ll_aic_enable_tx_dma
ll_aic_disable_tx_dma
ll_aic_set_mono_capture
ll_aic_enable_mono_to_stereo
ll_aic_disable_mono_to_stereo
ll_aic_enable_endian_swap
ll_aic_disable_endian_swap
ll_aic_enable_sign_convert
ll_aic_disable_sign_convert
ll_aic_flush_tx_fifo
ll_aic_flush_rx_fifo
ll_aic_enable_rx_overrun_irq
ll_aic_disable_rx_overrun_irq
ll_aic_enable_tx_underrun_irq
ll_aic_disable_tx_underrun_irq
ll_aic_enable_rx_fifo_service_irq
ll_aic_disable_rx_fifo_service_irq
ll_aic_enable_tx_fifo_service_irq
ll_aic_disable_tx_fifo_service_irq
ll_aic_enable_loopback
ll_aic_disable_loopback
ll_aic_enable_playback
ll_aic_disable_playback
ll_aic_enable_capture
ll_aic_disable_capture

I2SCR:

ll_aic_get_i2s_cr
ll_aic_set_i2s_cr
ll_aic_get_i2s_first_channel_left
ll_aic_set_i2s_first_channel_left
ll_aic_set_i2s_right_first
ll_aic_set_i2s_left_first
ll_aic_enable_i2s_lr_swap
ll_aic_disable_i2s_lr_swap
ll_aic_set_i2s_mode
ll_aic_set_msb_justified_mode

AICSR:

ll_aic_get_sr
ll_aic_get_rx_fifo_level
ll_aic_get_loop_fifo_level
ll_aic_get_tx_fifo_level
ll_aic_get_rx_overrun
ll_aic_clear_rx_overrun
ll_aic_get_tx_underrun
ll_aic_clear_tx_underrun
ll_aic_get_rx_fifo_service
ll_aic_get_tx_fifo_service
ll_aic_get_loop_fifo_overrun
ll_aic_clear_loop_fifo_overrun
ll_aic_get_loop_fifo_service

I2SSR、I2SDIV 和数据端口:

ll_aic_get_i2s_sr
ll_aic_get_i2s_channel_busy
ll_aic_get_i2s_tx_busy
ll_aic_get_i2s_rx_busy
ll_aic_get_i2s_busy
ll_aic_get_i2s_div
ll_aic_set_i2s_div
ll_aic_set_i2s_idv
ll_aic_set_i2s_dv
ll_aic_write_data
ll_aic_read_data
ll_aic_read_loop_data
ll_aic_set_loop_fifo_threshold

2 LL 寄存器快照

uint32_t aicfr = ll_aic_get_fr(AIC);
uint32_t aiccr = ll_aic_get_cr(AIC);
uint32_t i2ssr = ll_aic_get_i2s_sr(AIC);
uint32_t aicsr = ll_aic_get_sr(AIC);

读取 LL 寄存器前必须确保 AIC module gate 和必要时钟已开启。