I2S MIC on VIM3

I2SB_LRCLK connect PIN32(I2SB_LRCK)
I2SB_SCLK connect PIN29(I2SB_SCLK)
I2SB_DIN connect PIN33(I2SB_SDI)

1 Like

SO it’s GPIOA1, A2, A4 (VIM3_V12_Sch.pdf), RIGHT?
NEXT , I checked dts (kvim3.dts):
aml-audio-card,dai-link@1–>alsaPORT-i2s–>aml_tdmb–>
clocks = <&clkaudio CLKID_AUDIO_MCLK_B
&clkc CLKID_MPLL1
&clkc CLKID_MPLL0
&clkaudio CLKID_AUDIO_SPDIFOUT_CTRL>;
pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>;

         **tdmb_mclk ==GPIOA0, tdmout_b =GPIOA1, 2, 3, tdmin_b=GPIOA4**

------should I change to:
tdmb_mclk ==GPIOA1, tdmout_b =GPIOA2, tdmin_b=GPIOA4??
and the clocks ?

你好,你这边是否可以把问题重新梳理下,如下:

  • 硬件连接关系,需要完整一些,最好有完整的原理图
  • 关于你增加的模块,拍一个图Post上来
  • 此外,你上面说有问题,具体问题是怎样的?具体进一步的描述,比方是硬件通讯出错,还是没有声音?
  • 建议附上是完整Log

Good day!

你好!这样的,我外接了一个I2S的mic 三个管脚 三个GPIO,没声音。在查找原因,请你们帮我确认下哪些地方要改:

首先 aml-audio-card,dai-link@1 里的aml_tdmb 定义的管脚是pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>;

你提供的信息太有限了,没法定位问题,建议按照上面方式补充下信息,包括使用的Mic型号资料等。

Mic型号是SPH0645LM4H-B。系统默认支持PDM,现在换成I2S的,我用的是GPIOAO7, 8, 10.把aml_tdmb置为OKEY,默认使用的管脚是<&tdmb_mclk &tdmout_b < &tdmin_b>,分别是GPIOA0, 1 2 3, 4.我改为:
tdmin_b:tdmin_b {
mux { /GPIOAO_7,8,10/
groups = “tdmb_slv_sclk_ao”,
“tdmb_slv_fs_ao”,
“tdmb_din1_ao”;

		function = "tdmb_in_ao";
	};
};但是没作用,我又把占用GPIOAO_10的设备aml_spdif置为disabled,还是不起作用。LOG显示:

[ 3.533936@2] failed parse loopback, ignore it
[ 3.533972@2] aml_card_probe error ret:-517
[ 3.534415@2] aml_tdm_platform_probe, tdm ID = 0, lane_cnt = 4
[ 3.534430@2] TDM id 0 i2s2hdmi:0
[ 3.534438@2] snd_tdm ff642000.audiobus:tdma: lane_mask_out = 0, lane_oe_mask_out = 0
[ 3.534579@2] No channel mask node Channel_Mask
[ 3.534642@2] meson-g12a-pinctrl pinctrl@ff634480: function ‘tdmb_in_ao’ not supported
[ 3.534645@2] meson-g12a-pinctrl pinctrl@ff634480: invalid function tdmb_in_ao in map table
[ 3.534651@2] meson-g12a-pinctrl pinctrl@ff634480: function ‘tdmb_in_ao’ not supported
[ 3.534654@2] meson-g12a-pinctrl pinctrl@ff634480: invalid function tdmb_in_ao in map table
[ 3.534660@2] meson-g12a-pinctrl pinctrl@ff634480: function ‘tdmb_in_ao’ not supported
[ 3.534662@2] meson-g12a-pinctrl pinctrl@ff634480: invalid function tdmb_in_ao in map table
[ 3.534672@2] snd_tdm: probe of ff642000.audiobus:tdmb failed with error -22
[ 3.534843@2] aml_tdm_platform_probe, tdm ID = 2, lane_cnt = 4
请教下,为什么管脚加载失败。我用的都是pinctrl-meson-g12a.c里定义的

或者说要添加I2S的MIC,dts应该怎样配置

官方的系统,默认情况下,应该是有声卡信息的,先确定一下
/proc/asound/card0/pcm1c/info

可以用adb命令去录制一下,录制好后再播放file.wav文件

# adb shell
# su
# cd /sdcard
# tinycap  file.wav -D 0 -d 1 -c 2

默认情况是有声卡的,但是录的没声音。
修改GPIO之后,声卡就一个都不会生成。/proc/asound下没有card0

录音的时候,用示波器测量一下这几个管脚的信号
管脚配置应该是对的,你录音的时候是有打印信息的,先确保你那个MIC输入是不是正常的

[ 7034.358110] aml_tdm_open
[ 7034.358672] audio_ddr_mngr: toddrs[0] registered by device ff642000.audiobus:tdmb
[ 7034.358775] set mclk:11289600, mpll:22579200, get mclk:11289593, mpll:22579186
[ 7034.358779] asoc aml_dai_set_tdm_fmt, 0x4011, edde5110, id(1), clksel(1)
[ 7034.358781] aml_dai_set_tdm_fmt(), fmt not change
[ 7034.358786] dump_pcm_setting(edde5110)
[ 7034.358788] \x09pcm_mode(1)
[ 7034.358790] \x09sysclk(11289600)
[ 7034.358792] \x09sysclk_bclk_ratio(4)
[ 7034.358794] \x09bclk(2822400)
[ 7034.358796] \x09bclk_lrclk_ratio(64)
[ 7034.358798] \x09lrclk(44100)
[ 7034.358800] \x09tx_mask(0x3)
[ 7034.358802] \x09rx_mask(0x3)
[ 7034.358804] \x09slots(2)
[ 7034.358806] \x09slot_width(32)
[ 7034.358808] \x09lane_mask_in(0x2)
[ 7034.358810] \x09lane_mask_out(0x1)
[ 7034.358812] \x09lane_oe_mask_in(0x0)
[ 7034.358814] \x09lane_oe_mask_out(0x0)
[ 7034.358816] \x09lane_lb_mask_in(0x0)
[ 7034.358819] aml_dai_set_tdm_sysclk(), mpll no change, keep clk
[ 7034.358821] aml_dai_set_tdm_sysclk(), mclk no change, keep clk
[ 7034.358824] set mclk:11289600, mpll:22579200, get mclk:11289593, mpll:22579186
[ 7034.358827] aml_dai_set_clkdiv, div 4, clksel(1)
[ 7034.358834] aml_dai_set_bclk_ratio, select I2S mode
[ 7034.358839] tdmin set lane 1
[ 7034.358844] Not init vad
[ 7034.359000] Not init vad
[ 7034.359007] asoc-aml-card auge_sound: tdm prepare capture
[ 7034.360743] aml_dai_tdm_prepare Expected toddr src:TDMIN_B
[ 7034.366939] tdm capture mute: 0
[ 7034.366978] Not init vad
[ 7034.366998] asoc-aml-card auge_sound: tdm capture enable

[ 3.620537@0] no register datain_datalb_total,it also can work
[ 3.620538@0] parse loopback:, lb mode:0
[ 3.620541@0] datain_src:4, datain_chnum:8, datain_chumask:3f
[ 3.620542@0] datalb_src:2, datalb_chnum:8
[ 3.620544@0] datalb_chswap:0x0,datalb_chmask:3
[ 3.620546@0] failed parse loopback, ignore it
[ 3.621624@0] aml_pdm_probe
[ 3.829353@0] asoc-aml-card auge_sound: control 2:0:0:I2SIn CLK:0 is already present
[ 3.829359@0] snd_tdm ff642000.audiobus:tdmb: ASoC: Failed to add I2SIn CLK: -16
[ 3.829361@0] aml_dai_tdm_probe, failed add snd spdif controls
[ 3.829367@0] asoc-aml-card auge_sound: control 2:0:0:I2SIn CLK:0 is already present
[ 3.829371@0] snd_tdm ff642000.audiobus:tdmc: ASoC: Failed to add I2SIn CLK: -16
[ 3.829373@0] aml_dai_tdm_probe, failed add snd spdif controls
[ 3.829381@0] aml_pdm_dai_probe
[ 3.829383@0] aml_dai_spdif_probe
[ 3.829397@0] aml_dai_spdif_probe
[ 3.829402@0] asoc-aml-card auge_sound: control 2:0:0:I2SIn CLK:0 is already present
[ 3.829406@0] snd_tdm ff642000.audiobus:i2s2hdmi: ASoC: Failed to add I2SIn CLK: -16
[ 3.829407@0] aml_dai_tdm_probe, failed add snd spdif controls
[ 356.499336@3] asoc-aml-card auge_sound: tdm prepare----capture
[ 356.503108@3] aml_dai_tdm_prepare Expected toddr src:TDMIN_B
[ 356.509847@3] asoc-aml-card auge_sound: tdm capture enable
[ 370.509982@0] asoc-aml-card auge_sound: tdm capture stop
[ 370.510085@0] aml_dai_tdm_hw_free(), disable mclk for TDM-B[ 398.519105@0] ffs_retry_malloc_buffer
[ 398.519198@0] ffs_retry_malloc_buffer
[ 398.521022@0] ffs_retry_malloc_buffer

帮忙分析下,tmb时钟出错?另外tdmb里的 samesource_sel = <3> 代表spdif,是什么意思?刚好spdif占用了mic要用的GPIO10,这会引起冲突吗

你就用官方的固件验证,不要用你自己修改的去验证,官方的I2S信号时钟都是OK的,只是i2s_din没有验证,按我上面说的先确认清楚先

你好,有设备了但是没声音。LOG:
[ 3.599765@1] aml_pdm_probe
[ 3.599904@1] asoc-aml-card auge_sound: control 2:0:0:I2SIn CLK:0 is already present
[ 3.599909@1] snd_tdm ff642000.audiobus:tdmb: ASoC: Failed to add I2SIn CLK: -16
[ 3.599911@1] aml_dai_tdm_probe, failed add snd spdif controls
[ 3.599917@1] asoc-aml-card auge_sound: control 2:0:0:I2SIn CLK:0 is already present
[ 3.599921@1] snd_tdm ff642000.audiobus:tdmc: ASoC: Failed to add I2SIn CLK: -16
[ 3.599923@1] aml_dai_tdm_probe, failed add snd spdif controls
[ 3.599931@1] aml_pdm_dai_probe
[ 3.599933@1] aml_dai_spdif_probe
[ 3.599947@1] aml_dai_spdif_probe
[ 3.599951@1] asoc-aml-card auge_sound: control 2:0:0:I2SIn CLK:0 is already present
[ 3.599955@1] snd_tdm ff642000.audiobus:i2s2hdmi: ASoC: Failed to add I2SIn CLK: -16
[ 3.599957@1] aml_dai_tdm_probe, failed add snd spdif controls
帮分析下

你好,现在我把spdif删了,打印和你的差不多了。但是还没有声音,没波形:
[ 401.490021@2] mclk is not configured
[ 401.490194@2] asoc-aml-card auge_sound: tdm prepare----capture
[ 401.493856@2] aml_dai_tdm_prepare Expected toddr src:TDMIN_B
[ 401.499647@2] asoc-aml-card auge_sound: tdm capture enable
[ 401.747135@2] ASoC: multicodec <-> TDM-C No matching channels
[ 401.747229@3] ASoC: multicodec <-> TDM-B No matching channels
[ 401.753216@2] aml_pdm_open, stream:1
[ 401.756989@2] enter aml_pdm_close type: 1
[ 401.901119@3] audio_dsp: IEC958_mode_codec= 0, IEC958 type 2 CH PCM
[ 401.901741@3] audio_dsp: last mode 0,now 0
[ 406.735017@3] ASoC: multicodec <-> TDM-C No matching channels
[ 406.735238@3] aml_pdm_open, stream:1
[ 406.739126@3] enter aml_pdm_close type: 1
[ 406.741883@0] ASoC: multicodec <-> TDM-B No matching channels
[ 407.122232@2] audio_dsp: IEC958_mode_codec= 0, IEC958 type 2 CH PCM
[ 407.122914@2] audio_dsp: last mode 0,now 0
请教一些,mclk is not configured是怎么回事?我确认过GPIO没写错

我问下你这个I2S的MIC问题后来解决了没?我最近也想测试下A311D下I2S的MIC

后面我专门验证过,MIC是正常的,你用官方的固件验证就好

HI:
问下我们MIC管脚这样的接法image ,需要如何改动内核的配置支持?

内核不需要重新调整,你可以用tinycap命令去验证

HI:
你好,我们用的I2S麦克风是MSM261S4030H0R,用原始内核测试录音,用tinycap保存的数据发现都是0x00,硬件接的GPAOA_1,GPIOA_2和GPIOA_3(数据输入引脚)。
image
内核dmesg:
130|console:/ # dmesg | grep au[ 47.177164@2] [wlan0] wl_run_escan : LEGACY_SCAN sync ID: 1, bssidx: 0
dio
[ 4.559547] audio_dsp: [dsp]register dsp to char divece(257)
[ 4.559631] amaudio: amaudio: driver amaudio init!
[ 4.559891] amaudio: amaudio_init - amaudio: driver amaudio succuess!
[ 5.312179] usbcore: registered new interface driver snd-usb-audio
[ 5.312704] aml_codec_T9015 ff632000.t9015: aml_T9015_audio_codec_probe
[ 5.313990] asoc debug: aml_audio_controller_probe-127
[ 5.314736] snd_tdm ff642000.audiobus:tdma: lane_mask_out = 0, lane_oe_mask_out = 0
[ 5.314981] snd_tdm ff642000.audiobus:tdmb: lane_mask_out = 1, lane_oe_mask_out = 0
[ 5.315192] snd_tdm ff642000.audiobus:tdmc: lane_mask_out = 0, lane_oe_mask_out = 0
[ 5.315283] meson-g12a-pinctrl pinctrl@ff634480: pin-60 (ff642000.audiobus:tdmc) status -22
[ 5.315287] snd_tdm ff642000.audiobus:tdmc: Error applying setting, reverse things back
[ 5.315291] snd_tdm ff642000.audiobus:tdmc: aml_tdm_get_pins error!
[ 5.315790] hdmitx: audio: aout notify format CT_PCM
[ 5.316136] audio_ddr_mngr: 0, irqs toddr 47, frddr 50
[ 5.316137] audio_ddr_mngr: 1, irqs toddr 48, frddr 51
[ 5.316138] audio_ddr_mngr: 2, irqs toddr 49, frddr 52
[ 5.316298] loopback ff642000.audiobus:loopback@0: check whether to update loopback chipinfo
[ 5.316631] audiolocker_platform_probe
[ 5.524049] snd_tdm ff642000.audiobus:tdmb: ASoC: Failed to add I2SIn CLK: -16
[ 5.524055] snd_tdm ff642000.audiobus:tdmc: ASoC: Failed to add I2SIn CLK: -16
[ 5.525679] asoc-aml-card auge_sound: dummy <-> ff642000.audiobus:loopback@0 mapping ok
[ 11.237176] ff642000.audiobus:tdmb is using the pin GPIOA_4 as pinmux
[ 11.962400] audio_ddr_mngr: toddrs[0] registered by device ff642000.audiobus:spdif
[ 11.962738] audio_ddr_mngr: toddrs[0] released by device ff642000.audiobus:spdif
[ 11.965621] audio_ddr_mngr: toddrs[0] registered by device ff642000.audiobus:tdma
[ 11.965776] audio_ddr_mngr: toddrs[0] released by device ff642000.audiobus:tdma
[ 11.976255] audio_ddr_mngr: toddrs[0] registered by device ff642000.audiobus:loopback@0
[ 11.976505] audio_ddr_mngr: toddrs[0] released by device ff642000.audiobus:loopback@0
[ 11.982652] audio_ddr_mngr: toddrs[0] registered by device ff642000.audiobus:tdmb
[ 11.982884] audio_ddr_mngr: toddrs[0] released by device ff642000.audiobus:tdmb
[ 11.996255] audio_ddr_mngr: toddrs[0] registered by device ff642000.audiobus:tdmc
[ 11.997508] audio_ddr_mngr: toddrs[0] released by device ff642000.audiobus:tdmc
[ 21.782604] Not init audio effects
[ 21.783356] audio_ddr_mngr: frddrs[0] registered by device ff642000.audiobus:tdmb
[ 21.783489] audio_ddr_mngr: frddr_set_sharebuffer_enable sel:1, dst_src:3
[ 27.529047] audio_ddr_mngr: frddr_set_sharebuffer_enable sel:1, dst_src:3
[ 27.529117] audio_ddr_mngr: frddrs[0] released by device ff642000.audiobus:tdmb
[ 29.137063] audio_dsp: dts_dec_control/0x0
[ 30.723079] Not init audio effects
[ 30.724701] audio_ddr_mngr: frddrs[0] registered by device ff642000.audiobus:tdmb
[ 30.726847] audio_ddr_mngr: frddr_set_sharebuffer_enable sel:1, dst_src:3
[ 36.474798] audio_ddr_mngr: frddr_set_sharebuffer_enable sel:1, dst_src:3
[ 36.474895] audio_ddr_mngr: frddrs[0] released by device ff642000.audiobus:tdmb
用app测试:tinycap /sdcard/1.wav -d 1 -c 2 -r 16000 -p 256
打印log:
[ 59.519918@0] aml_tdm_open
[ 59.520731@0] asoc-aml-card auge_sound: tdm prepare capture
[ 59.527140@0] aml_dai_tdm_prepare Expected toddr src:TDMIN_B
[ 59.532840@0] asoc-aml-card auge_sound: tdm capture enable
我发现原始内核中tdm的dts配置是这样的
tdmout_b: tdmout_b {
mux { /* GPIOA_1, GPIOA_2, GPIOA_3 */
groups = “tdmb_sclk”,
“tdmb_fs”,
“tdmb_dout0”;
function = “tdmb_out”;
drive-strength = <2>;
};
};

tdmin_b:tdmin_b {
	mux { /* GPIOA_4 */
		groups = "tdmb_din1"
			/*,"tdmb_slv_sclk", "tdmb_slv_fs"*/;
		function = "tdmb_in";
		drive-strength = <2>;
	};
};

系统默认是配置成tdmbout,其中GPIOA_3是作为输出管脚的,我们现在需要把GPIOA_3配置成输入数据管脚使能tdmbin是不是需要修改?

你理解错了,默认GIPOA_4才是I2S IN功能脚,GPIOA_3是I2S OUT功能脚,把MIC的输出接到GPIOA_4管脚上,另外时钟那些也要接上