Jetson nano i2s microphone on production model using custom carrier board

Hello,
We have the following hardware

  • Jetson board: Jetson nano tegra210-p3448-0002-p3449-0000-b00 (uses eMMC memory)
  • Carrier board: custom carrier board
  • Environment: Jetpack: 4.6.1 [L4T 32.7.1]

The problem: We want to use the microphone connected to the i2s interface to record the sound. We got a “static noise” that doesn’t change. Check the .wav file attached.

What we tried to do:

  • The microphone is connected, via a MIPI (CSI) cable, to the following pins:
    Jetson nano signal name <-> Customer Usage <-> Pin Direction

    • I2S0_DIN <-> I2S4B_SDATA_IN <-> Input
    • I2S0_FS <-> I2S4B_LRCK <-> Output
    • I2S0_SCLK <-> I2S4B_SCLK <-> Output
  • These values were updated in the jetson nano pinmux template by the people who made the custom carrier board and all the connections. I’ve followed the tutorial from the official site [1] (Updating the Bootloader Pinmux), generated the gpio and pinmux .dtsi files, copied them to the porg-platforms, and then generated the dtb file. Then, I copied the dtb file to the kernel/dtb and reflashed the jetson module.
    – I’ve executed the following command to see pinctrl:
    → sudo grep dap4 /sys/kernel/debug/tegra_pinctrl_reg
    and got the result:
    Bank: 1 Reg: 0x70003144 Val: 0x00000000 → dap4_fs_pj4
    Bank: 1 Reg: 0x70003148 Val: 0x00000044 → dap4_din_pj5
    Bank: 1 Reg: 0x7000314c Val: 0x00000015 → dap4_dout_pj6
    Bank: 1 Reg: 0x70003150 Val: 0x00000000 → dap4_sclk_pj7
    This means that the dtb was flashed with the new changes. (With the default pinmux there were other Val)

  • I’ve tried to record from the microphone using this command and settings from this post [2]:
    → arecord -D hw:tegrasndt210ref,0 -r 44100 -f S32_LE -c 1 -d 10 -v test.wav
    The output was:
    Recording WAVE ‘test.wav’ : Signed 32 bit Little Endian, Rate 44100 Hz, Mono
    Hardware PCM card 1 ‘tegra-snd-t210ref-mobile-rt565x’ device 0 subdevice 0
    Its setup is:
    stream : CAPTURE
    access : RW_INTERLEAVED
    format : S32_LE
    subformat : STD
    channels : 1
    rate : 44100
    exact rate : 44100 (44100/1)
    msbits : 32
    buffer_size : 8192
    period_size : 2048
    period_time : 46439
    tstamp_mode : NONE
    tstamp_type : MONOTONIC
    period_step : 1
    avail_min : 2048
    period_event : 0
    start_threshold : 1
    stop_threshold : 8192
    silence_threshold: 0
    silence_size : 0
    boundary : 4611686018427387904
    appl_ptr : 0
    hw_ptr : 0

  • Using a production module with eMMC, I could not enable the i2s interface using jetson-IO. From this post [3] and this [4], it seems that it is necessary only to update the pinmux (for production module, if r32.3+) and the i2s will be enabled.

  • I’ve tried other settings for amixer (changing the number of channels, sample rate, fsync) and also I’ve tried to force the pins to the I2S, like in this post [5]. Or changed codec frame mode as in this post [6].

  • The solution, for the developer kit, seems to be enabling i2s4 vi jetson-io, and for the production module should have been changing the pinmux config.

Can someone give me a hint or some other ideas?
If you need other details let me know. Thanks in advance.

[1] Tegra Linux Driver
[2] I2S microphone - no sound - #10 by sujimenon6
[3] I2s on jetson nano produciton - #2 by jonathanh
[4] Jetson nano microphone tdm config - #24 by jonathanh
[5] Audio I2S on 40 Pin Connector - #48 by jonathanh
[6] Jetson Nano i2s/tdm configuration - #2 by jonathanh

Hi Skewmix,

Thanks for taking effort in posting the issue along with necessary inputs.

Pinmux register values seem to be wrong. They should be as mentioned in Audio I2S on 40 Pin Connector - #54 by jonathanh. I would suggest to redo the pinmux changes as guided in link. Yes, Jetson-IO tool works for dev kit only.

No need to modify any amixer settings or other register rewrites. The default ones should work fine once the pinmux is set as desired.

Thanks

Hi atalambedu,

Thanks for the answer, now I know where to look. I will try to modify the pinmux and I will come back with the result, regardless the output.

Hello again,
I’ve updated the pinmux, and now I’ve got the following:
→ sudo grep dap4 /sys/kernel/debug/tegra_pinctrl_reg
Bank: 1 Reg: 0x70003144 Val: 0x00000044 → dap4_fs_pj4
Bank: 1 Reg: 0x70003148 Val: 0x00000044 → dap4_din_pj5
Bank: 1 Reg: 0x7000314c Val: 0x00000015 → dap4_dout_pj6
Bank: 1 Reg: 0x70003150 Val: 0x00000044 → dap4_sclk_pj7

The results (recordings) were the same, and I’ve tried adjusting the mixer like in this comment [1], but there was no change in the output.

Maybe the problem is elsewhere. Do I have to activate somehow the i2s?

[1] Audio I2S on 40 Pin Connector - #57 by BARO

Hi Skewminx,

Could you probe the Jetson SCLK, FS and DATA lines while running the record and quote the behaviour.

SCLK should be operating at Fs*sample_width*channel_count while FS should be running at a frequency equal to sample rate. Also is the i2s mic independently verified with any other board to rule out that its not an issue with mic?

Also, ensure below mixer settings are set and share the mixer setting dump f no issue with clocks (amixer -c tegrasndt210ref contents > ~/settings_dump)

amixer -c tegrasndt210ref cset "ADMAIF1 Mux" I2S4
amixer -c tegrasndt210ref cset name="I2S4 codec master mode" "cbs-cfs" //Ensures Jetson is master

Thanks

Hi atalambedu,

Unfortunately, I do not have the necessary tools for probing.

I don’t know if the mic was verified with any other board, but I think I’ll try that. Also, maybe I’ll try with the original carrier board and developer module.
I know that the mic is activated if the frequency is > 1kHz, else the mic is in sleep mode. I’ll check those frequencies.

Here is the setting_dump
settings_dump (143.4 KB)

And the output of this command, before the recording and when I was recording.
sudo grep “clock|extern1|i2s4|pll_a_out” /sys/kernel/debug/clk/clk_summary

Thanks.

Hi Skewminx,

While you verify the mic wit other boards, I see that i2s4 is not up in clk summary when you are recording which should not be the case.

Can you run aplay on i2s4 after making below connection

amixer -c tegrasndt210ref cset “I2S1 Mux” ADMAIF1
aplay -D hw:tegrasndt210ref,0 some_44_1k_mono_file.wav

and chk clk_summary during the playback. This shall ensure that pinmux is taking effect (Ensure to set pinmux of I2S4 DOUT pin as well i.e all 4 pins of I2S4)

Thanks

Hi atalambedu,

The result is the same as before, after running the commands, i2s4 is not up in clk summary during playback.

The I2s4 DOUT pin is not connected to anything on the board. But, I set the pin as output, reflash, but no change. I don’t think that DOUT is the problem.

I found though that there is something on I2S3 when recording.

Thanks.

Hi Skewminx,

Looks like the i2s numbering in clk summary starts from 0. so i2s3 is the right entry to be looked at and its running at 2822400 which implies that you might have played 44100*2*32 (Fs * chan * sample width) wav file. so I2S bit clock form Jetson I2S is fine. Since FS is derived from this line, I suppose it will also be fine

If you had oscilloscope, could have probed data Line to see if data input from mic is noisy even when clocks are fine. So, you may need to check if there is no issue with mic with some other board when supplied with same power voltage and clocks

Thanks