把设备树修改后,重新编译烧录,开机后串口如下打印:
[ 4.056922] ALSA device list:
[ 4.059891] #0: rockchip,tlv320aic32x4-codec
表示声卡注册好了
但是会打印报错,报错如下:
[root@rk3288:/]# [ 65.850876] aic32x4: invalid frequency to set DAI system clock
[ 65.856714] audio freq is 11289600
[ 65.860256] asoc-simple-card sound: ASoC: machine hw_params failed: -22
[ 65.866931] aic32x4: invalid frequency to set DAI system clock
[ 65.872770] audio freq is 11289600
[ 65.876263] asoc-simple-card sound: ASoC: machine hw_params failed: -22
[ 65.882975] aic32x4: invalid frequency to set DAI system clock
[ 65.888814] audio freq is 11289600
[ 65.888820] asoc-simple-card sound: ASoC: machine hw_params failed: -22
这个说明MCLK,也就是CPU出来的系统时钟出现了问题。后来询问RK的FAE,得到RK的MCLK是:
256fs, 11289600, 12288000
然后查看驱动,发现10年没有更新啦。所以修改驱动代码:
tlv320aic32x4.h中增加如下代码:
#define AIC32X4_FREQ_12000000 12000000
#define AIC32X4_FREQ_24000000 24000000
#define AIC32X4_FREQ_25000000 25000000
#define AIC32X4_FREQ_11289600 11289600
#define AIC32X4_FREQ_12288000 12288000
tlv320aic32x4.c中增加如下代码:
static const struct aic32x4_rate_divs aic32x4_divs[] = {
/*mclk;rate;p_val;pll_j;pll_d;dosr;ndac;mdac;aosr;nadc;madc;blck_N;*/
/* 8k rate */
{AIC32X4_FREQ_12000000, 8000, 1, 7, 6800, 768, 5, 3, 128, 5, 18, 24},
{AIC32X4_FREQ_24000000, 8000, 2, 7, 6800, 768, 15, 1, 64, 45, 4, 24},
{AIC32X4_FREQ_25000000, 8000, 2, 7, 3728, 768, 15, 1, 64, 45, 4, 24},
{AIC32X4_FREQ_11289600, 8000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 8000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 11.025k rate */
{AIC32X4_FREQ_12000000, 11025, 1, 7, 5264, 512, 8, 2, 128, 8, 8, 16},
{AIC32X4_FREQ_24000000, 11025, 2, 7, 5264, 512, 16, 1, 64, 32, 4, 16},
{AIC32X4_FREQ_11289600, 11025, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 11025, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 16k rate */
{AIC32X4_FREQ_12000000, 16000, 1, 7, 6800, 384, 5, 3, 128, 5, 9, 12},
{AIC32X4_FREQ_24000000, 16000, 2, 7, 6800, 384, 15, 1, 64, 18, 5, 12},
{AIC32X4_FREQ_25000000, 16000, 2, 7, 3728, 384, 15, 1, 64, 18, 5, 12},
{AIC32X4_FREQ_11289600, 16000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 16000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 22.05k rate */
{AIC32X4_FREQ_12000000, 22050, 1, 7, 5264, 256, 4, 4, 128, 4, 8, 8},
{AIC32X4_FREQ_24000000, 22050, 2, 7, 5264, 256, 16, 1, 64, 16, 4, 8},
{AIC32X4_FREQ_25000000, 22050, 2, 7, 2253, 256, 16, 1, 64, 16, 4, 8},
{AIC32X4_FREQ_11289600, 22000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 22000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 32k rate */
{AIC32X4_FREQ_12000000, 32000, 1, 7, 1680, 192, 2, 7, 64, 2, 21, 6},
{AIC32X4_FREQ_24000000, 32000, 2, 7, 1680, 192, 7, 2, 64, 7, 6, 6},
{AIC32X4_FREQ_11289600, 32000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 32000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 44.1k rate */
{AIC32X4_FREQ_12000000, 44100, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_24000000, 44100, 2, 7, 5264, 128, 8, 2, 64, 8, 4, 4},
{AIC32X4_FREQ_25000000, 44100, 2, 7, 2253, 128, 8, 2, 64, 8, 4, 4},
{AIC32X4_FREQ_11289600, 44100, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 44100, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 48k rate */
{AIC32X4_FREQ_12000000, 48000, 1, 8, 1920, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_24000000, 48000, 2, 8, 1920, 128, 8, 2, 64, 8, 4, 4},
{AIC32X4_FREQ_25000000, 48000, 2, 7, 8643, 128, 8, 2, 64, 8, 4, 4},
{AIC32X4_FREQ_11289600, 48000, 1, 8, 1920, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 48000, 1, 8, 1920, 128, 2, 8, 128, 2, 8, 4},
};
static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai,
int clk_id, unsigned int freq, int dir)
{
struct snd_soc_codec *codec = codec_dai->codec;
struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec);
switch (freq) {
case AIC32X4_FREQ_12000000:
case AIC32X4_FREQ_24000000:
case AIC32X4_FREQ_25000000:
case AIC32X4_FREQ_11289600:
case AIC32X4_FREQ_12288000:
aic32x4->sysclk = freq;
return 0;
}
printk(KERN_ERR "aic32x4: invalid frequency to set DAI system clockn");
printk(KERN_ERR "audio freq is %d n",freq);//11289600
return -EINVAL;
}
添加了RK对应的MCLK后,播放WAV文件就不会报错啦。
声卡注册好了以后,进去调试阶段:
1.通过如下命令确认声卡是否注册成功
[root@rk3288:/]# cat /proc/asound/cards
0 [rockchiptlv320a]: rockchip_tlv320 - rockchip,tlv320aic32x4-codec
rockchip,tlv320aic32x4-codec
[root@rk3288:/]#
[root@rk3288:/]# ls -l /dev/snd/
drwxr-xr-x 2 root root 60 Jan 18 13:08 by-path
crw-rw---- 1 root audio 116, 2 Jan 18 13:08 controlC0
crw-rw---- 1 root audio 116, 4 Jan 18 13:08 pcmC0D0c
crw-rw---- 1 root audio 116, 3 Jan 18 13:08 pcmC0D0p
crw-rw---- 1 root audio 116, 5 Jan 18 13:08 pcmC0D1p
crw-rw---- 1 root audio 116, 1 Jan 18 13:08 seq
crw-rw---- 1 root audio 116, 33 Jan 18 13:08 timer
[root@rk3288:/]#
2. 通过命令行播放录制调试声卡:
播放:一般播放 1khz 0db 正弦波,然后在 codec 输出端示波器简单测量是否失真,杂音,然
后再使用音频分析仪测试指标
3. 通过命令行调试声卡的通路
4. tinymix 调试通路
把设备树修改后,重新编译烧录,开机后串口如下打印:
[ 4.056922] ALSA device list:
[ 4.059891] #0: rockchip,tlv320aic32x4-codec
表示声卡注册好了
但是会打印报错,报错如下:
[root@rk3288:/]# [ 65.850876] aic32x4: invalid frequency to set DAI system clock
[ 65.856714] audio freq is 11289600
[ 65.860256] asoc-simple-card sound: ASoC: machine hw_params failed: -22
[ 65.866931] aic32x4: invalid frequency to set DAI system clock
[ 65.872770] audio freq is 11289600
[ 65.876263] asoc-simple-card sound: ASoC: machine hw_params failed: -22
[ 65.882975] aic32x4: invalid frequency to set DAI system clock
[ 65.888814] audio freq is 11289600
[ 65.888820] asoc-simple-card sound: ASoC: machine hw_params failed: -22
这个说明MCLK,也就是CPU出来的系统时钟出现了问题。后来询问RK的FAE,得到RK的MCLK是:
256fs, 11289600, 12288000
然后查看驱动,发现10年没有更新啦。所以修改驱动代码:
tlv320aic32x4.h中增加如下代码:
#define AIC32X4_FREQ_12000000 12000000
#define AIC32X4_FREQ_24000000 24000000
#define AIC32X4_FREQ_25000000 25000000
#define AIC32X4_FREQ_11289600 11289600
#define AIC32X4_FREQ_12288000 12288000
tlv320aic32x4.c中增加如下代码:
static const struct aic32x4_rate_divs aic32x4_divs[] = {
/*mclk;rate;p_val;pll_j;pll_d;dosr;ndac;mdac;aosr;nadc;madc;blck_N;*/
/* 8k rate */
{AIC32X4_FREQ_12000000, 8000, 1, 7, 6800, 768, 5, 3, 128, 5, 18, 24},
{AIC32X4_FREQ_24000000, 8000, 2, 7, 6800, 768, 15, 1, 64, 45, 4, 24},
{AIC32X4_FREQ_25000000, 8000, 2, 7, 3728, 768, 15, 1, 64, 45, 4, 24},
{AIC32X4_FREQ_11289600, 8000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 8000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 11.025k rate */
{AIC32X4_FREQ_12000000, 11025, 1, 7, 5264, 512, 8, 2, 128, 8, 8, 16},
{AIC32X4_FREQ_24000000, 11025, 2, 7, 5264, 512, 16, 1, 64, 32, 4, 16},
{AIC32X4_FREQ_11289600, 11025, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 11025, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 16k rate */
{AIC32X4_FREQ_12000000, 16000, 1, 7, 6800, 384, 5, 3, 128, 5, 9, 12},
{AIC32X4_FREQ_24000000, 16000, 2, 7, 6800, 384, 15, 1, 64, 18, 5, 12},
{AIC32X4_FREQ_25000000, 16000, 2, 7, 3728, 384, 15, 1, 64, 18, 5, 12},
{AIC32X4_FREQ_11289600, 16000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 16000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 22.05k rate */
{AIC32X4_FREQ_12000000, 22050, 1, 7, 5264, 256, 4, 4, 128, 4, 8, 8},
{AIC32X4_FREQ_24000000, 22050, 2, 7, 5264, 256, 16, 1, 64, 16, 4, 8},
{AIC32X4_FREQ_25000000, 22050, 2, 7, 2253, 256, 16, 1, 64, 16, 4, 8},
{AIC32X4_FREQ_11289600, 22000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 22000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 32k rate */
{AIC32X4_FREQ_12000000, 32000, 1, 7, 1680, 192, 2, 7, 64, 2, 21, 6},
{AIC32X4_FREQ_24000000, 32000, 2, 7, 1680, 192, 7, 2, 64, 7, 6, 6},
{AIC32X4_FREQ_11289600, 32000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 32000, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 44.1k rate */
{AIC32X4_FREQ_12000000, 44100, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_24000000, 44100, 2, 7, 5264, 128, 8, 2, 64, 8, 4, 4},
{AIC32X4_FREQ_25000000, 44100, 2, 7, 2253, 128, 8, 2, 64, 8, 4, 4},
{AIC32X4_FREQ_11289600, 44100, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 44100, 1, 7, 5264, 128, 2, 8, 128, 2, 8, 4},
/* 48k rate */
{AIC32X4_FREQ_12000000, 48000, 1, 8, 1920, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_24000000, 48000, 2, 8, 1920, 128, 8, 2, 64, 8, 4, 4},
{AIC32X4_FREQ_25000000, 48000, 2, 7, 8643, 128, 8, 2, 64, 8, 4, 4},
{AIC32X4_FREQ_11289600, 48000, 1, 8, 1920, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_12288000, 48000, 1, 8, 1920, 128, 2, 8, 128, 2, 8, 4},
};
static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai,
int clk_id, unsigned int freq, int dir)
{
struct snd_soc_codec *codec = codec_dai->codec;
struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec);
switch (freq) {
case AIC32X4_FREQ_12000000:
case AIC32X4_FREQ_24000000:
case AIC32X4_FREQ_25000000:
case AIC32X4_FREQ_11289600:
case AIC32X4_FREQ_12288000:
aic32x4->sysclk = freq;
return 0;
}
printk(KERN_ERR "aic32x4: invalid frequency to set DAI system clockn");
printk(KERN_ERR "audio freq is %d n",freq);//11289600
return -EINVAL;
}
添加了RK对应的MCLK后,播放WAV文件就不会报错啦。
声卡注册好了以后,进去调试阶段:
1.通过如下命令确认声卡是否注册成功
[root@rk3288:/]# cat /proc/asound/cards
0 [rockchiptlv320a]: rockchip_tlv320 - rockchip,tlv320aic32x4-codec
rockchip,tlv320aic32x4-codec
[root@rk3288:/]#
[root@rk3288:/]# ls -l /dev/snd/
drwxr-xr-x 2 root root 60 Jan 18 13:08 by-path
crw-rw---- 1 root audio 116, 2 Jan 18 13:08 controlC0
crw-rw---- 1 root audio 116, 4 Jan 18 13:08 pcmC0D0c
crw-rw---- 1 root audio 116, 3 Jan 18 13:08 pcmC0D0p
crw-rw---- 1 root audio 116, 5 Jan 18 13:08 pcmC0D1p
crw-rw---- 1 root audio 116, 1 Jan 18 13:08 seq
crw-rw---- 1 root audio 116, 33 Jan 18 13:08 timer
[root@rk3288:/]#
2. 通过命令行播放录制调试声卡:
播放:一般播放 1khz 0db 正弦波,然后在 codec 输出端示波器简单测量是否失真,杂音,然
后再使用音频分析仪测试指标
3. 通过命令行调试声卡的通路
4. tinymix 调试通路
举报