Я пытаюсь заставить работать светодиоды 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 нет ошибок, но вывод сигнала все еще не верен.
Может кто-нибудь мне помочь или дать мне хорошее место для документации? Заранее спасибо!