Linux音频驱动及ALSA框架下外部时钟选择通用方案问询
I2S外部时钟动态切换的无驱动修改通用方案
业内已经有成熟的无需修改Codec驱动的实现方案,常见的三类方案如下:
- 硬件自动切换方案:针对常用的两类采样率簇(44.1kHz系列:44.1/88.2/176.4kHz;48kHz系列:48/96/192kHz),直接选用带LRCK检测功能的专用音频时钟切换IC,外接两路对应频率的固定晶振。硬件层面将I2S的LRCK引脚接入切换IC的检测端,出厂预先配置好切换逻辑,IC会自动根据当前LRCK的频率切换对应晶振输出MCLK/BCLK,全程不需要软件/驱动参与,完全不涉及Codec驱动修改。
- 主控通用时钟输出配置方案:将I2S的MCLK源改为外接SOC的通用时钟(GCLK)输出引脚,无需修改Codec驱动,只需要在用户态/系统HAL层调用系统原生的时钟控制接口调整GCLK输出频率即可。比如Linux系统下直接调用
clk_set_rate操作对应GCLK节点,Android系统通过原生HAL层的时钟控制API调整,根据当前播放的采样率动态输出匹配的MCLK频率即可。 - 外置可编程时钟芯片用户态控制方案:选用带I2C/SPI控制接口的可编程音频时钟芯片(如Si5351、Si5340等),直接通过系统通用的I2C/SPI用户态驱动操作芯片寄存器,根据当前采样率切换输出对应频率的MCLK/BCLK,Codec驱动仅需要正常接收符合规格的时钟输入即可,不需要做任何修改。
额外注意:如果Codec的设备树(DTS)配置中硬编码了固定的MCLK倍率约束,仅需要修改DTS配置放开约束即可,不属于Codec驱动代码修改的范畴。
内容的提问来源于stack exchange,提问作者Waldorf
相关产品推荐
相关产品推荐

