Проблемы с устройством NanoPI NEO / NEO AIR I2S DAudio WS2812 DeviceTree
Я пытаюсь заставить работать светодиоды 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>;
};
Я попытался вставить его в дерево устройств платы вот так:
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 ошибок не было, но выходной сигнал по-прежнему неправильный.
Может ли кто-нибудь помочь мне или дать мне хорошее место для документации? Заранее спасибо!