Использование I2S на Raspberry Pi 5 (проблема с device tree)
Всем доброго времени суток! Стоит задача - подключить к Raspberry Pi 5 микрофоны по интерфейсу I2S в количестве 6 штук. На сколько я понимаю задача реальная, Rpi5 имеет на борту контроллер GPIO RP1, в доке на который есть таблица GPIO function selection:
GPIO | function a2 |
---|---|
GPIO 18 | I2S0_SCLK |
GPIO 19 | I2S0_WS |
GPIO 20 | I2S0_SDI[0] |
GPIO 22 | I2S0_SDI[1] |
GPIO 24 | I2S0_SDI[2] |
GPIO 26 | I2S0_SDI[3] |
Также инфа из доки: I2S0 is a clock-producer (master) with up to 4 bidirectional channels. Each channel’s I2S data receive pin is connected to sdi[n].
Я подключил микрофоны как правый/левый каналы на пины соответствующие I2S0_SDI[0], I2S0_SDI[1], I2S0_SDI[2]. Написал оверлей .dts, скомпилировал в .dtbo и прописал в config.txt. Вот оверлей:
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2712";
fragment@0 {
target = <&i2s>;
__overlay__ {
status = "okay";
};
};
fragment@1 {
target-path = "/";
__overlay__ {
dmic_codec: dmic-codec {
#sound-dai-cells = <0>;
compatible = "dmic-codec";
status = "okay";
};
};
};
fragment@2 {
target = <&sound>;
slave_overlay: __overlay__ {
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,name = "soundcard";
simple-audio-card,bitclock-slave = <&dailink0_slave>;
simple-audio-card,frame-slave = <&dailink0_slave>;
status = "okay";
simple-audio-card,cpu {
sound-dai = <&i2s>;
dai-tdm-slot-num = <2>;
dai-tdm-slot-width = <32>;
};
dailink0_slave: simple-audio-card,codec {
sound-dai = <&dmic_codec>;
};
};
};
__overrides__ {
alsaname = <&slave_overlay>,"simple-audio-card,name";
compatible = <&dmic_codec>,"compatible";
};
};
Проблема в том, что работает только пара микрофонов, подключенных к I2S0_SDI[0]. Остальные пины даже не назначены на альтернативную функцию:
pi@raspberrypi:~ $ pinctrl
...
18: a2 pn | lo // GPIO18 = I2S0_SCLK
19: a2 pn | lo // GPIO19 = I2S0_WS
20: a2 pn | hi // GPIO20 = I2S0_SDI0
21: a2 pn | lo // GPIO21 = I2S0_SDO0
22: no pd | -- // GPIO22 = none
23: no pd | -- // GPIO23 = none
24: no pd | -- // GPIO24 = none
...
Помогите, пожалуйста, разобраться с проблемой. Многое уже перепробовал, не знаю как решить это
Заранее спасибо!