NanoPI NEO / NEO AIR I2S DAudio WS2812 Проблемы с устройством - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь заставить работать светодиоды WS2812 через шину I2S, используя NanoPI NEO AIR Я нашел хорошую библиотеку , которая использует ALSA-Audio для передачи данных на WS2812.

Библиотека довольно старая и использует ядро ​​3.4.113 с Armbian. Он работает так, как должен, когда я использую этот старый Linux образ, но я хочу использовать более современную систему, которая поставляется с ядром 5.4.28 и поэтому использует DeviceTree вместо script.bin / fex.

Старое ядро ​​

В старом ядре должны быть установлены следующие параметры:

[twi1]
twi_used = 0

[pcm0]
daudio_used = 1
sample_resolution = 16
slot_width_select = 16
pcm_lrck_period = 16
slot_width = 16

Список аудиоустройств с

aplay -l

результаты:

карта 1: snddaudio [snddaudio], устройство 0: SUNXI-TDM0 snddaudio-0 []

Новое ядро ​​

В новом ядре отсутствует script.bin и вместо него используется DeviceTree.

Кажется, что нет хорошей документации для устройств I2S DAudio, поэтому я взял наложение dts с форума armbian :

/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun8i-h3";

    fragment@0 { 
        target-path = "/"; 
        __overlay__ { 
            pcm5102a: pcm5102a {
            #sound-dai-cells = <0>;
            compatible = "ti,pcm5102a";
            pcm510x,format = "i2s";
            };
        }; 
    }; 

    fragment@1 {
        target = <&i2s0>;
        __overlay__ {
            status = "okay";
            pinctrl-0 = <&i2s0_pins>;
            sound-dai = <&pcm5102a>;
            pinctrl-names = "default";
        };
    };

    fragment@2 {
        target-path = "/";
        __overlay__ {
            sound_i2s {
                compatible = "simple-audio-card";
                simple-audio-card,name = "I2S-master";
                simple-audio-card,mclk-fs = <256>;
                simple-audio-card,format = "i2s";
                        status = "okay";

                simple-audio-card,cpu {
                    sound-dai = <&i2s0>;
                };

                simple-audio-card,codec {
                    sound-dai = <&pcm5102a>;
                };
            };
        };
    };
};

И включил устройство I2S в плате dts:

        i2s@1c22000 {
            #sound-dai-cells = <0x00>;
            compatible = "allwinner,sun8i-h3-i2s";
            reg = <0x1c22000 0x400>;
            interrupts = <0x00 0x0d 0x04>;
            clocks = <0x03 0x38 0x03 0x54>;
            clock-names = "apb\0mod";
            dmas = <0x15 0x03 0x15 0x03>;
            resets = <0x03 0x2b>;
            dma-names = "rx\0tx";
            status = "okay";
            phandle = <0x5c>;
        };

Я могу видеть устройство I2S с

aplay - l

карта 0: I2Smaster [I2S-master], устройство 0: 1c22000.i2s-pcm5102a-hifi pcm5102a-hifi-0 [1c22000.i2s-pcm5102a-hifi pcm5102a-hifi -0]

Но вывод не правильный, и мне не хватает конфигурации, которая была установлена ​​в script.bin .

Я нашел кусок DeviceTree , который, кажется, именно то, что мне нужно, но я не уверен, как интегрировать это в мой DeviceTree / Overlay.

        daudio@0x01c22000 {
            audio_format = <0x1>;
            clocks = <0x3 0x3b>;
            compatible = "allwinner,sunxi-daudio";
            daudio_master = <0x4>;
            device_type = "daudio0";
            frametype = <0x0>;
            linux,phandle = <0x52>;
            mclk_div = <0x0>;
            pcm_lrckr_period = <0x1>;
            pcm_lrck_period = <0x20>;
            pcm_lsb_first = <0x0>;
            phandle = <0x52>;
            pinctrl-0 = <0x3c>;
            pinctrl-1 = <0x3d>;
            pinctrl-names = "default", "sleep";
            reg = <0x0 0x1c22000 0x0 0x70>;
            rx_data_mode = <0x0>;
            signal_inversion = <0x1>;
            slot_width_select = <0x10>;
            status = "disabled";
            tdm_config = <0x1>;
            tdm_num = <0x0>;
            tx_data_mode = <0x0>;
        };

Я пытался вставить его в devicetree платы примерно так:

        i2s@1c22000 {
            #sound-dai-cells = <0x00>;
            compatible = "allwinner,sun8i-h3-i2s";
            reg = <0x1c22000 0x400>;
            interrupts = <0x00 0x0d 0x04>;
            clocks = <0x03 0x38 0x03 0x54>;
            clock-names = "apb\0mod";
            dmas = <0x15 0x03 0x15 0x03>;
            resets = <0x03 0x2b>;
            dma-names = "rx\0tx";
            status = "disabled";
            phandle = <0x5c>;
            slot_width_select = <0x10>;
            device_type = "daudio0";
            pcm_lrckr_period = <0x1>;
            pcm_lrck_period = <0x10>;
            audio_format = <0x1>;
        };

Компилируется в dtb и в dmesg нет ошибок, но вывод сигнала все еще не верен.

Может кто-нибудь мне помочь или дать мне хорошее место для документации? Заранее спасибо!

...