pdm接口数字mic调试
首先,rk3566平台是带有pdm接口,因此使用数字mic不需要外挂7210这样的ic
只需要配置接口即可
rk817-sound {
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,name = "rockchip,rk817-codec";
simple-audio-card,mclk-fs = <256>; //chencx add
simple-audio-card,dai-link@0 {
format = "i2s";
cpu {
sound-dai = <&i2s1_8ch>; //这是模拟功放的
};
codec {
sound-dai = <&rk817_codec 0>; //这是codec节点
};
};
simple-audio-card,dai-link@1 {
format = "pdm";
cpu {
sound-dai = <&pdm>; //这是数字pdm节点,需要自己配置
};
codec {
sound-dai = <&rk817_codec 1>; //把数字Pdm加入到codec声卡中
};
};
};
接着就是配置pdm参数而已,这个可以参考doc下面文档,我也是参照配置来的
//chencx add pdm
&pdm {
status = "okay";
#sound-dai-cells = <0>;
pinctrl-names = "default";
rockchip,path-map = <1 0 2 3>; //修改默认通道顺序
capture,channel-mapping = <2>;
pinctrl-0 = <
&pdmm0_clk1
&pdmm0_sdi1 //接的sdi1接口,这个按照原理图来
>;
};
文档在 Y:\rk\rk3566\rk3566\RKDocs\common\Audio\Rockchip_Developer_Guide_Audio_CN.pdf

然后需要在codec下面增加pdmdata-out-enable的属性
rk817_codec: codec {
#sound-dai-cells = <1>;
compatible = "rockchip,rk817-codec";
clocks = <&cru I2S1_MCLKOUT_TX>;
clock-names = "mclk";
//assigned-clocks = <&cru I2S1_MCLKOUT_TX>;
//assigned-clock-parents = <&cru CLK_I2S1_8CH_TX>;
assigned-clocks = <&cru I2S1_MCLKOUT>, <&cru I2S1_MCLK_TX_IOE>;
assigned-clock-rates = <12288000>;
//assigned-clock-rates = <11289600>;
assigned-clock-parents = <&cru I2S1_MCLKOUT_TX>, <&cru I2S1_MCLKOUT_TX>;
pinctrl-names = "default";
pinctrl-0 = <&i2s1m0_mclk>;
hp-volume = <3>;
spk-volume = <3>;//max-0 min-255
out-l2spk-r2hp;
//数字pdm
pdmdata-out-enable;
//喇叭控制脚
spk-ctl-gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>;
mic-ctl-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
};
};
查看生成的节点
ls /dev/snd/* -ls crw-rw---- 1 system audio 116, 5 2021-12-04 06:44 controlC0 crwxrwxrwx 1 system audio 116, 2 2021-12-04 06:44 pcmC0D0c crw-rw---- 1 system audio 116, 4 2021-12-04 06:44 pcmC0D1c //增加的输入节点 crw-rw---- 1 system audio 116, 3 2021-12-04 06:44 pcmC0D1p crw-rw---- 1 system audio 116, 33 2021-12-04 06:44 timer
调试中遇到的问题
使用tinuycap的时候 -D 是声卡 -d是devices,所以这里使用命令-d为1
tinycap 32bit-44k.wav -D 0 -d 1 -c 2 -r 16000 -b 32 -p 1024 -n 3 -T 20
使用后发现还是没有声音,命令改为-c 8才有,因为默认通道0 1 上面采集数据,这里是多通道配置,所以没有声音,-c 8后面就看到声音很小,实际上是有声音的而且正常
之后修改声卡声音顺序,把通道顺序调整,就可以在默认声卡使用了
rockchip,path-map = <1 0 2 3>; //先采集1 通道 然后 0 2 3 。这样就把有声音的通道1作为 优先采集了
经过这次操作 就可以录制到正常的声卡声音,但是声音比较小
之后,使用拾音算法,就可增加声音增益了,
修改 external/tinyalsa//pcm.c
static short out_vol = 5.0; static void volume_process(const void *buffer, unsigned int channels,size_t length, short volume) { short * buffer_end = (short*)buffer + length/2; short * pcmData = (short *)buffer; int i = 0; int pcmval; int tenp = channels ; while (pcmData < buffer_end) { /// if (i % channels != 1 && i % channels != 0) { /// printf("***\n"); pcmval = (short)*pcmData * volume; if (pcmval < 32768 && pcmval > -32768) { *pcmData = pcmval; } else if (pcmval > 32767) { *pcmData = 32767; } else if (pcmval < -32767) { *pcmData = -32767; } ///} ++pcmData; i++; } } ......... int pcm_read(struct pcm *pcm, void *data, unsigned int count) { struct snd_xferi x; int i = 0 ; short *temp = (short*)data ; if (!(pcm->flags & PCM_IN)) return -EINVAL; //printf("start---read---\n") ; memset(data, 0, count); x.buf = data; x.frames = count / (pcm->config.channels * pcm_format_to_bits(pcm->config.format) / 8); for (;;) { if (!pcm->running) { if (pcm_start(pcm) < 0) { fprintf(stderr, "start error"); return -errno; } } .................................................. for(i=0;i<10;i++) { printf("%d\n", temp[i]) ; } //printf("---\n"); volume_process(x.buf, pcm->config.channels,count , out_vol); return 0; } }
到这里,使用是没有什么问题了

浙公网安备 33010602011771号