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 和必要时钟已开启。