LINUX.ORG.RU

Использование I2S на Raspberry Pi 5 (проблема с device tree)

 , , ,


0

3

Всем доброго времени суток! Стоит задача - подключить к Raspberry Pi 5 микрофоны по интерфейсу I2S в количестве 6 штук. На сколько я понимаю задача реальная, Rpi5 имеет на борту контроллер GPIO RP1, в доке на который есть таблица GPIO function selection:

GPIOfunction a2
GPIO 18I2S0_SCLK
GPIO 19I2S0_WS
GPIO 20I2S0_SDI[0]
GPIO 22I2S0_SDI[1]
GPIO 24I2S0_SDI[2]
GPIO 26I2S0_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
...

Помогите, пожалуйста, разобраться с проблемой. Многое уже перепробовал, не знаю как решить это

Заранее спасибо!