最近在调试wm8960, 在此记录一下。
ALSA 架构下,imx6平台的wm8960驱动支持两种模式。
codec-master
在codec-master模式下,由芯片旁的晶振提供mclk时钟(我用的是24m),wm8960输出bclk时钟给cpu
codec-slave
在codec-slave模式下,由cpu输出mclk时钟(我用的是24m),bclk时钟给wm8960.
在两种模式的切换时,有个坑,在imx6内部有个音频路由模块audmux,默认的代码只用于codec-slave模式
...
ret = imx_audmux_v2_configure_port(int_port,
IMX_AUDMUX_V2_PTCR_SYN |
IMX_AUDMUX_V2_PTCR_TFSEL(ext_port) |
IMX_AUDMUX_V2_PTCR_TCSEL(ext_port) |
IMX_AUDMUX_V2_PTCR_TFSDIR |
IMX_AUDMUX_V2_PTCR_TCLKDIR,
IMX_AUDMUX_V2_PDCR_RXDSEL(ext_port));
...
请将ext_port 和int_port的位置交换,才能用于codec-master模式。修改为:
...
ret = imx_audmux_v2_configure_port(ext_port,
IMX_AUDMUX_V2_PTCR_SYN |
IMX_AUDMUX_V2_PTCR_TFSEL(int_port) |
IMX_AUDMUX_V2_PTCR_TCSEL(int_port) |
IMX_AUDMUX_V2_PTCR_TFSDIR |
IMX_AUDMUX_V2_PTCR_TCLKDIR,
IMX_AUDMUX_V2_PDCR_RXDSEL(int_port));
...