I2S/TDM 时钟、格式与 RK3588 控制器
1. RK3588 驱动
主驱动:sound/soc/rockchip/rockchip_i2s_tdm.c,匹配:
1 | rockchip,rk3588-i2s-tdm |
旧控制器由 rockchip_i2s.c 支持,RK3588 DTS 中也存在兼容旧 I2S IP 的节点。具体板卡启用哪些节点由 DTS 决定。
2. 信号
- MCLK:codec/控制器主时钟;
- BCLK/SCLK:每 bit 时钟;
- LRCK/FS:frame/左右声道同步;
- SDI/SDO:数据 lane。
常见:
1 | BCLK = sample_rate * slots * slot_width |
例如 48 kHz × 2 × 32 = 3.072 MHz BCLK。
3. 格式
snd_soc_dai_set_fmt() 组合:
- I2S;
- Left/Right Justified;
- DSP_A/DSP_B;
- clock inversion;
- CPU/codec bit/frame clock master。
双方 master 设置冲突会无时钟或总线争用。
4. TDM
set_tdm_slot() 指定:
- TX/RX slot mask;
- slots;
- slot width。
channel 与 slot 不完全等同。多 lane 模式将 slots 分布到多个 data pin,需 DTS pinctrl 和驱动 lane 配置一致。
5. hw_params
驱动典型步骤:
- 根据 format 选 sample width;
- 配置 channel/slot;
- 计算 BCLK div;
- 设置 MCLK;
- 写 CKR/TXCR/RXCR 等寄存器;
- 设置 FIFO/DMA;
- 对称 rate/channel 约束。
时钟无法精确整除时应返回错误,不能静默使用错误采样率。
6. Trigger
START/RESUME/PAUSE_RELEASE:
- 启 DMA request;
- 启 TX/RX;
- 清 FIFO/状态;
- 处理同步启动。
STOP/SUSPEND/PAUSE_PUSH 反向关闭。播放停止过早关时钟可能截断最后样本。
7. TRCM
rockchip_trcm.c 支持 TX/RX common clock / 同步模式,使双向流共享时钟并协调启动。SND_SOC_ROCKCHIP_I2S_TDM 会选择 TRCM 支持。
使用场景:
- 全双工同步;
- codec要求连续时钟;
- 多 DAI 同步。
代价是方向之间参数约束更强。
8. Clock/GRF
RK3588 音频还涉及:
- CRU clock parents/dividers;
- reset;
- GRF/IO mux;
- pinctrl;
- assigned-clocks/rates/parents;
- power domain。
驱动 probe 成功不代表引脚和外部 codec 已有正确时钟。
9. 常见故障
| 现象 | 检查 |
|---|---|
| 无 BCLK/LRCK | master、clock、trigger、pinctrl |
| 速率偏差 | MCLK parent/divider、PLL family |
| 声道错位 | slot mask/width、format |
| 噪声 | word length、inversion、RGM? 实为音频 pin 时序 |
| 只单向工作 | DMA、SDI/SDO pin、TRCM |
| hw_params EINVAL | rate/format/channel/clock 不可满足 |
正在加载留言…