LINUX.ORG.RU

i2s в Onion Omega 2+

 ,


0

1

Привет, лор. Помоги в который уже раз.

Есть Onion Omega 2+, у которой заявлен интерфейс i2s. На этот i2s заведен АЦП TI PCM1808 (это не кодек и вообще неразумная железка, управления в общем случае не требует). Вопрос знатокам - как завести вывод с i2s в юзермод? Хочется, конечно, чтобы это была просто виртуальная саундкарта, видимая в alsa.

Железка работает под LEDE/OpenWRT с оверлеями от производителя, я собираю все из стабильной ветки.

Вопрос не новый, много где рассматривался. В интернетах есть мнение, что достаточно добавить «что-то» в device tree и все волшебным образом заработает. Но у меня так и не хватило знаний/мозгов сделать это. Что я уже пробовал:

Во всех случаях arecord -l и aplay -l возвращают --- no soundcards ---, на модуль snd_soc_ralink_i2s всегда 0 ссылок в lsmod.

Не предоставляю подробной инфы (логи, dmesg и проч) потому что не уверен, что копаю в нужную сторону, но предоставлю если надо.

Ответ на: комментарий от leet27

Модуль загружается, звуковая карта не появляется

значит неправильно прописал в DT

Что должно в итоге получиться?

звуковое устройство alsa. У тебя в ядре должен быть ASoC драйвер для i2s интерфейса твоего процессора, драйвер кодека в патче, в DT ты должен объяснить ядру что твой кодек подключен к процессорному i2s-мастеру. При инициализации asoc сконфигурирует i2s мастера и он через DMA начнет заливать данные в буфер PCM. Где исходники от твоей платы и как называется *.dts твоей платы ? У тебя там какой-то прыщемипс - он вообзе поддерживает device tree ?

anonymous ()
Ответ на: комментарий от anonymous

Знач так. Исходники в гите, уже говорил. Плата Omega2+, соответственно, DT в https://github.com/OnionIoT/source/blob/openwrt-18.06/target/linux/ramips/dts/OMEGA2P.dts. Я его справил до такого состояния:

/dts-v1/;

#include "OMEGA2.dtsi"

/ {
	compatible = "onion,omega2p", "onion,omega2", "mediatek,mt7628an-soc";
	model = "Onion Omega2+";

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x8000000>;
	};

    sound {
		compatible = "simple-audio-card";
		simple-audio-card,name = "Vaporsound";
		simple-audio-card,widgets =
			"Speaker", "Speaker",
			"Line", "Line";
		simple-audio-card,routing =
			"Speaker", "Playback",
			"Line", "Capture";

		simple-audio-card,dai-link {
			format = "i2s";
			bitclock_master = <&sound_codec>;
			frame_master = <&sound_cpu>;

			sound_cpu: cpu {
				sound-dai = <&i2s>;
				system-clock-frequency = <24576000>;
			};

			sound_codec: codec {
				sound-dai = <&pcm1808>;
				system-clock-frequency = <24576000>;
			};
		};
	};

	pcm1808: pcm1808 {
		#sound-dai-cells = <0>;
		compatible = "ti,pcm1808";
	};
};

&firmware {
	reg = <0x50000 0x1f30000>;
};

&flash {
	user: partition@1f80000 {
		label = "user";
		reg = <0x1f80000 0x80000>;
	};
};

&system_led {
	label = "omega2p:amber:system";
};

&i2s {
    #sound-dai-cells = <0>;
    status = "okay";
 };

Я исправил всякие Kconfig и Makefile, чтобы pcm1808.c собрался и получился snd-soc-pcm1808.ko. Он получился и собрался. Я пересобрал со всем этим добром ядро. Что я вижу:

root@Omega-E194:~# lsmod | grep snd
ac97_bus                 975  2 snd_soc_core,snd_ac97_codec
i2c_core               24424  5 snd_soc_wm8960,v4l2_common,videodev,i2c_dev,regmap_i2c
regmap_i2c              2298  1 snd_soc_wm8960
snd_ac97_codec         79902  0
snd_compress           10436  0
snd_hwdep               4286  1 snd_usb_audio
snd_mixer_oss          12729  1 snd_pcm_oss
snd_pcm                61710  7 snd_usb_audio,snd_soc_ralink_i2s,snd_soc_wm8960,snd_soc_core,snd_ac97_codec,snd_pcm_dmaengine,snd_pcm_oss
snd_pcm_dmaengine       2971  1 snd_soc_core
snd_pcm_oss            36177  0
snd_rawmidi            16298  1 snd_usbmidi_lib
snd_seq_device          2191  1 snd_rawmidi
snd_soc_core          118433  5 snd_soc_pcm1808,snd_soc_simple_card,snd_soc_simple_card_utils,snd_soc_ralink_i2s,snd_soc_wm8960
snd_soc_pcm1808         2064  0
snd_soc_ralink_i2s      7088  0
snd_soc_simple_card     4304  0
snd_soc_simple_card_utils    5095  1 snd_soc_simple_card
snd_soc_wm8960         24224  0
snd_timer              15806  1 snd_pcm
snd_usb_audio         121378  0
snd_usbmidi_lib        16883  1 snd_usb_audio
usbcore               137059 29 option,uvcvideo,usb_wwan,snd_usb_audio,pl2303,ftdi_sio,cp210x,ch341,usbserial,usblp,usbhid,ums_usbat,ums_sddr55,ums_sddr09,ums_karma,ums_jumpshot,ums_isd200,ums_freecom,ums_datafab,ums_cypress,ums_alauda,snd_usbmidi_lib,cdc_acm,btusb,usb_storage,ohci_platform,ohci_hcd,ehci_platform,ehci_hcd

snd_soc_ralink_i2s 0, snd_soc_simple_card 0.

root@Omega-E194:~# cat /proc/asound/cards
--- no soundcards ---
root@Omega-E194:~# cat /proc/asound/devices
 33:        : timer
root@Omega-E194:~# alsactl init
alsactl: init:1757: No soundcards found...
root@Omega-E194:~# cat /sys/kernel/debug/asoc/codecs
pcm1808
snd-soc-dummy
leet27 ()
Ответ на: комментарий от leet27

Я понимаю, что такие правки dt предназначены для вЫвода звука

нет - это в оригинале было ДВА кодека, один проигрывать умеет и для такого бутера у них ещше патч есть. Тебе этого не надо - у тебя только захват так что убери из DT «Speaker», «Speaker», «Speaker», «Playback» - с этими строками точно не срастется потому что в твоем кодеке нет воспроизведения

		simple-audio-card,widgets =
			"Line", "Line";
		simple-audio-card,routing =
			"Line", "Capture";

и покажи dmesg после этого - там должно быть в логе если что-то не так, я не могу сходу сказать что еще может быть пропустили

anonymous ()
Ответ на: комментарий от anonymous

Сделал.

dmesg не влез в сообщение, https://pastebin.com/aaQX909d

root@Omega-E194:~# lsmod | grep snd
ac97_bus                 975  2 snd_soc_core,snd_ac97_codec
i2c_core               24424  5 snd_soc_wm8960,v4l2_common,videodev,i2c_dev,regmap_i2c
regmap_i2c              2298  1 snd_soc_wm8960
snd_ac97_codec         79902  0
snd_compress           10436  0
snd_hwdep               4286  1 snd_usb_audio
snd_mixer_oss          12729  1 snd_pcm_oss
snd_pcm                61710  7 snd_usb_audio,snd_soc_ralink_i2s,snd_soc_wm8960,snd_soc_core,snd_ac97_codec,snd_pcm_dmaengine,snd_pcm_oss
snd_pcm_dmaengine       2971  1 snd_soc_core
snd_pcm_oss            36177  0
snd_rawmidi            16298  1 snd_usbmidi_lib
snd_seq_device          2191  1 snd_rawmidi
snd_soc_core          118433  5 snd_soc_simple_card,snd_soc_simple_card_utils,snd_soc_ralink_i2s,snd_soc_pcm1808,snd_soc_wm8960
snd_soc_pcm1808         1968  0
snd_soc_ralink_i2s      7088  0
snd_soc_simple_card     4304  0
snd_soc_simple_card_utils    5095  1 snd_soc_simple_card
snd_soc_wm8960         24224  0
snd_timer              15806  1 snd_pcm
snd_usb_audio         121378  0
snd_usbmidi_lib        16883  1 snd_usb_audio
usbcore               137059 29 option,uvcvideo,usb_wwan,snd_usb_audio,pl2303,ftdi_sio,cp210x,ch341,usbserial,usblp,usbhid,ums_usbat,ums_sddr55,ums_sddr09,ums_karma,ums_jumpshot,ums_isd200,ums_freecom,ums_datafab,ums_cypress,ums_alauda,snd_usbmidi_lib,cdc_acm,btusb,usb_storage,ohci_platform,ohci_hcd,ehci_platform,ehci_hcd
leet27 ()
Ответ на: комментарий от leet27

dmesg без этой ошибки, больше изменений нет

я вообще ничего не вижу про звук в логе

Linux version 4.14.81 (user@xubu-vm) (gcc version 7.3.0 (OpenWrt GCC 7.3.0 r7460-52a1594fbb)) #0 Fri Dec 6 16:26:42 2019

и судя по логу ядро не пересобиталось ниразу с 2019 года :) dtb точно твой измененный загружается ? Попробуй изменить название платы в DT

	model = "Vasyan Onion Omega2+";

и посмотреть в логе - изменилось ли название

[ 0.000000] MIPS: machine is Onion Omega2+

anonymous ()
Ответ на: комментарий от anonymous

Хорошая версия, анон, но нет:

root@Omega-E194:~# dmesg
[    0.000000] Linux version 4.14.81 (user@xubu-vm) (gcc version 7.3.0 (OpenWrt GCC 7.3.0 r7460-52a1594fbb)) #0 Fri Dec 6 16:26:42 2019
[    0.000000] Board has DDR2
[    0.000000] Analog PMU set to hw control
[    0.000000] Digital PMU set to hw control
[    0.000000] SoC Type: MediaTek MT7688 ver:1 eco:2
[    0.000000] bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 00019655 (MIPS 24KEc)
[    0.000000] MIPS: machine is blahblah Onion Omega2+
[    0.000000] Determined physical RAM map:
[    0.000000]  memory: 08000000 @ 00000000 (usable)
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.000000] Zone ranges:

При этом на машине где все это собирается

user@xubu-vm:~/onion_build_system/source$ date
Чт янв 30 15:33:18 MSK 2020
leet27 ()
Ответ на: комментарий от leet27

Непонятно почему лог молчит как будто ядро даже не пытается ничего создавать - когда что-то не так оно всегда верещит в логе. Попробуй так

/dts-v1/;

#include "OMEGA2.dtsi"

/ {
	compatible = "onion,omega2p", "onion,omega2", "mediatek,mt7628an-soc";
	model = "LOR Onion Omega2+";

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x8000000>;
	};

	sound {
		compatible = "simple-audio-card";
		simple-audio-card,name = "Vaporsound";

		simple-audio-card,widgets =
			"Line", "Line";

		simple-audio-card,routing =
			"Line", "Capture";

		simple-audio-card,format = "i2s";
		simple-audio-card,bitclock-master = <&sound_codec>;
		simple-audio-card,frame-master = <&sound_cpu>;

		sound_cpu: simple-audio-card,cpu {
			sound-dai = <&i2s>;
			system-clock-frequency = <24576000>;
		};

		sound_codec: simple-audio-card,codec {
			sound-dai = <&pcm1808>;
			system-clock-frequency = <24576000>;
		};
	};

	pcm1808: pcm1808 {
		#sound-dai-cells = <0>;
		compatible = "ti,pcm1808";
	};
};

&firmware {
	reg = <0x50000 0x1f30000>;
};

&flash {
	user: partition@1f80000 {
		label = "user";
		reg = <0x1f80000 0x80000>;
	};
};

&system_led {
	label = "omega2p:amber:system";
};

&i2s {
	#sound-dai-cells = <0>;
	status = "okay";
};

в таком стиле у меня описание simple-audio-card точно работает в 4.14 на другом процессоре. Про дату понятно - виртуалка у тебя и ядро не пересобирается после правки DT. Главное что dtb исправленный грузится. Если сможешь - добавь опцию debug в параметрах загрузки ядра.

anonymous ()
Ответ на: комментарий от anonymous

попробуй так

Попробовал, разницы не вижу - https://pastebin.com/Xm7yVPFD

виртуалка у тебя и ядро не пересобирается после правки DT

А почему? Я проверял - менял какой-то модуль с модуля на статик (с M на *), модуль пропадал из lsmod, поэтому я решил что ядро все-таки пересобирается.

добавь опцию debug в параметрах загрузки ядра

Пока не получилось, не уверен что это возможно.

leet27 ()
Ответ на: комментарий от leet27

Я проверял - менял какой-то модуль с модуля на статик (с M на *), модуль пропадал из lsmod, поэтому я решил что ядро все-таки пересобирается.

вот кстати сделай все модули которые касаются звука статически слинкованными, заодним и проверишь пересобирается ядро или нет

Пока не получилось, не уверен что это возможно.

возможно 100%, только я с openwrt и твоим процессором незнаком - где там надо добавить в загрузчике или в конфиге ядра или в DTS

    chosen {
            bootargs = "console=ttyS0,115200 rootfstype=squashfs,jffs2 debug";
    };

в логе параметры загрузки видно тут

[ 0.000000] Kernel command line: console=ttyS0,115200 rootfstype=squashfs,jffs2

anonymous ()
Ответ на: комментарий от anonymous

С дебагом вообще вяло. И в звуке включил всякие debug info, и на уровне ядра generate debug info, а вывод не меняется.

Вот настройки звука (так наверно удобнее, нежели diffconfig)

https://snipboard.io/ENmvrM.jpg

https://snipboard.io/nI6JRu.jpg

https://snipboard.io/9Sp2xR.jpg

Логи:

dmesg

lsmod

В остальном без изменений.

leet27 ()
Ответ на: комментарий от leet27

#0 Fri Dec 6 16:26:42 2019

В остальном без изменений.

у тебя ядро от старой сборки загружается. Такое ощущение что оно пересобирается, драйверы от новой сборки попадают в корневую потому что пропадают те что типа в имидже слинкованы, а имидж ядра старый. Как тебе это удаётся я не знаю.

anonymous ()
Ответ на: комментарий от anonymous

Я перед этой сборкой делал make target/linux/{clean,prepare} V=s. И еще вот вывод ls из папки с ядром (это я так думаю, что это ядро):

user@xubu-vm:~/onion_build_system/source/build_dir/target-mipsel_24kc_musl/linux-ramips_mt76x8$ ls --full-time -F
итого 46128
drwxr-xr-x 15 user user     4096 2020-01-30 19:37:20.000097825 +0300 backports-2017-11-01/
drwxr-xr-x  4 user user     4096 2020-01-30 19:37:25.588053897 +0300 base-files/
drwxr-xr-x  5 user user     4096 2020-01-30 19:37:19.588101080 +0300 exfat-nofuse-2017-06-20-de4c760b/
drwxrwxr-x  5 user user     4096 2020-01-30 19:37:04.952217970 +0300 gpio-button-hotplug/
drwxr-xr-x 16 user user     4096 2020-01-30 19:37:18.232111804 +0300 iptables-1.6.2/
drwxrwxr-x 26 user user     4096 2020-01-30 19:41:14.442528749 +0300 linux-4.14.81/
drwxr-xr-x  6 user user     4096 2020-01-30 19:37:04.004225631 +0300 linux-atm-2.5.2/
drwxrwxr-x  4 user user     4096 2020-01-30 19:37:13.416150056 +0300 mtd/
-rw-r--r--  1 user user  1708926 2020-01-30 19:37:50.987858771 +0300 omega2p-kernel.bin
-rw-r--r--  1 user user     9886 2020-01-30 19:37:48.627876593 +0300 omega2p-kernel.bin.dtb
drwxr-xr-x 13 user user     4096 2020-01-30 19:37:22.476078316 +0300 opkg-2017-12-07-3b417b9f/
drwxr-xr-x  5 user user     4096 2020-01-30 19:37:02.700236191 +0300 p44-ledchain/
drwxr-xr-x  4 user user     4096 2020-01-30 19:37:15.636132392 +0300 packages/
-rw-r--r--  1 user user  8109702 2020-01-30 19:37:51.667853649 +0300 root.squashfs
drwxr-xr-x 11 user user     4096 2020-01-30 19:37:25.100057718 +0300 rtl8812au-2018-11-16-661268fd/
drwxrwxr-x  5 user user     4096 2020-01-30 19:37:22.036081776 +0300 spi-gpio-custom/
drwxr-xr-x  2 user user     4096 2020-01-30 19:37:51.683853529 +0300 tmp/
-rwxr-xr-x  1 user user  5415340 2020-01-30 19:13:23.365194235 +0300 vmlinux*
-rwxr-xr-x  1 user user 26488008 2020-01-30 19:13:22.817202877 +0300 vmlinux.debug*
-rwxr-xr-x  1 user user  5420404 2020-01-30 19:13:23.377194046 +0300 vmlinux.elf*
drwxrwxr-x  5 user user     4096 2020-01-30 19:37:22.032081808 +0300 w1-gpio-custom/
drwxr-xr-x  6 user user     4096 2020-01-30 19:37:15.416134139 +0300 wifi-warp-core-0.1.0/
drwxr-xr-x  6 user user     4096 2020-01-30 19:37:22.688076648 +0300 WireGuard-0.0.20180718/

Как еще ядро может попасть в сборку?

leet27 ()
Ответ на: комментарий от leet27

Как еще ядро может попасть в сборку?

в openwrt не знаю, смотри что там твои наркоманы накрутили

[    0.391792] m25p80 spi0.0: mx25l25635e (32768 Kbytes)
[    0.396975] 5 fixed-partitions partitions found on MTD device spi0.0
[    0.403480] Creating 5 MTD partitions on "spi0.0":
[    0.408358] 0x000000000000-0x000000030000 : "u-boot"
[    0.414350] 0x000000030000-0x000000040000 : "u-boot-env"
[    0.420656] 0x000000040000-0x000000050000 : "factory"
[    0.426616] 0x000000050000-0x000001f80000 : "firmware"
[    0.509585] 2 uimage-fw partitions found on MTD device firmware
[    0.515614] 0x000000050000-0x0000001f137e : "kernel"
[    0.521617] 0x0000001f137e-0x000001f80000 : "rootfs"
[    0.527423] mtd: device 5 (rootfs) set to be root filesystem
[    0.534744] 1 squashfs-split partitions found on MTD device rootfs
[    0.541085] 0x0000009b0000-0x000001f80000 : "rootfs_data"
[    0.547501] 0x000001f80000-0x000002000000 : "user"

Ядро загружает загрузчик - откуда он берет ядро смотри его переменные окружения и команду загрузки

anonymous ()
Ответ на: комментарий от anonymous

А это за отмазку не проканает (сборочный скрипт берет дату не реалтайм, а из коммита в репе)? У меня есть get_source_date_epoch.sh, но оверрайднуть что-то не получилось, может не туда положил version.date.

leet27 ()
Ответ на: комментарий от leet27

А это за отмазку не проканает (сборочный скрипт берет дату не реалтайм, а из коммита в репе)?

может и так - гадай сейчас чем еще нахлобучило наркоманов. Если не было очистки ядра а просто пересборка - должен номер сборки увеличиваться, а у тебя во всех логах #0.

anonymous ()
Ответ на: комментарий от anonymous

Добрался до платы, подправил немного драйвер кодека чтобы собрался, в свой dts скопипастил из варианта который я написал кусок sonud {} с кодеком - только интерфейс i2s свой подставил

[    0.000000] Linux version 4.14.98 (anon@anon) (gcc version 8.3.0 (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36))) #2 SMP PREEMPT Fri Jan 31 01:06:10 MSK 2020
[    0.000000] Boot CPU: AArch64 Processor [410fd034]

.....

[    3.338292] asoc-simple-card sound: pcm1808-hifi <-> 30030000.sai mapping ok
[    3.345363] asoc-simple-card sound: ASoC: no DMI vendor name!
[    3.352736] snvs_rtc 30370000.snvs:snvs-rtc-lp: setting system clock to 1970-01-01 00:00:01 UTC (1)
[    3.371409] ALSA device list:
[    3.374392]   #0: Vaporsound
anonymous ()
Ответ на: комментарий от anonymous

Спасибо, анон. Респект. Теперь я хотя бы знаю, как это должно в итоге выглядеть. Попробую зайти с другой стороны: вот тут заявлено, что оно искаропки поддерживает вывод через MAX98367A. Попробую поковырять дерево и сам кодек, чтобы заменить его своим.

leet27 ()
Ответ на: комментарий от leet27

я включил дебаг для pinctrl. Упоминаний 1808 по-прежнему нет

модули для звука статически слинкованы ? тут у тебя нормально было

i2s в Onion Omega 2+ (комментарий)

хз как в openwrt подгружаются модули - нормального udev там похоже нет, мой лог со статикой - иначе ты такого в логе не увидишь, только через arecord или другими средствами

anonymous ()
Ответ на: комментарий от anonymous

Немного правильных ответов для пришедших из поиска.

Нашлись две хороших темы на официальном форуме, благодаря им удалось запустить все. В принципе, все мы/я делали правильно, ключевых недоделок две - надо включить gdma в DT и включить кодек spdif и в дереве все свести к стандартному spdif.

Работающее включение в dt (виджет playback надо удалить, но пока не проверял)

sound {
            compatible = "simple-audio-card";
            simple-audio-card,name = "Audio-I2S";
            simple-audio-card,format = "i2s";
            simple-audio-card,widgets =
                    "Speaker", "External Speaker",
                    "Microphone", "Microphone Jack";

            simple-audio-card,dai-link@0{
                format = "i2s";
                cpu {
                    sound-dai = <&i2s>;
                };
                codec {
                    sound-dai = <&codec_out>;
               };
           };

           simple-audio-card,dai-link@1{
               format = "i2s";
               cpu {
                   sound-dai = <&i2s>;
               };
               codec {
                   sound-dai = <&codec_in>;
               };
           };

    };

    codec_out: txcodec {
        #sound-dai-cells = <0>;
        #address-cells = <0>;
        #size-cells = <0>;
        compatible = "linux,spdif-dit";
        status = "okay";
    };

    codec_in: rxcodec {
        #sound-dai-cells = <0>;
        compatible = "linux,spdif-dir";
    };

Не забыть включить gmda:

&gdma
{
    status="okay";
}

У меня так не компилится с невнятной ошибкой, включил gdma прям в mt****an.dts, который инклудится в omega2p.dts(i) (заменил disabled на okay в секции gdma).

Так же надо не забыть или собрать модули snd-soc-spdif-rx/tx в статике, или подключить их в target/linux/ramips/modules.mk.

Теперь устройство есть,

root@Omega-E194:~# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: AudioI2S [Audio-I2S], device 1: ralink-i2s-dir-hifi dir-hifi-1 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

и даже пишет звук:

root@Omega-E194:~# arecord -d 5 -D plughw:0,1 -c2 -r 16000 -f S24_LE foobar.wav -v
Recording WAVE 'foobar.wav' : Signed 24 bit Little Endian, Rate 16000 Hz, Stereo
Plug PCM: Linear conversion PCM (S24_BE)
Its setup is:
  stream       : CAPTURE
  access       : RW_INTERLEAVED
  format       : S24_LE
  subformat    : STD
  channels     : 2
  rate         : 16000
  exact rate   : 16000 (16000/1)
  msbits       : 32
  buffer_size  : 8192
  period_size  : 1024
  period_time  : 64000
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 1024
  period_event : 0
  start_threshold  : 1
  stop_threshold   : 8192
  silence_threshold: 0
  silence_size : 0
  boundary     : 1073741824
Slave: Hardware PCM card 0 'Audio-I2S' device 1 subdevice 0
Its setup is:
  stream       : CAPTURE
  access       : MMAP_INTERLEAVED
  format       : S24_BE
  subformat    : STD
  channels     : 2
  rate         : 16000
  exact rate   : 16000 (16000/1)
  msbits       : 32
  buffer_size  : 8192
  period_size  : 1024
  period_time  : 64000
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 1024
  period_event : 0
  start_threshold  : 1
  stop_threshold   : 8192
  silence_threshold: 0
  silence_size : 0
  boundary     : 1073741824
  appl_ptr     : 0
  hw_ptr       : 0

Правда, вместо звука там хрень какая-то, но, похоже, там проблемы с аппаратной частью со стороны обвязки pcm1808.

leet27 ()
Ответ на: комментарий от leet27

Правда, вместо звука там хрень какая-то, но, похоже, там проблемы с аппаратной частью со стороны обвязки pcm1808.

то что как то создалось устройство хорошо но это конечно через попец сделано с spdif - драйвер кодека не просто какой попало нужен а тот что описывает формат данных этого кодека даже если он «тупой» хотя он на самом деле не тупой.

http://www.ti.com/lit/ds/symlink/pcm1808.pdf

В режиме слейва (битклок и фреймы левый/правый канал генерирует процессор) он автоматом определяет частоту дискретизации и им управлять не нужно, для выбора этого режима нужно подтянуть MD1(PIN11) MD0(PIN10) к земле - тебя лучше такой режим использовать и проверить что i2s процессора в режиме мастера работает - в DT это у тебя не описано

7.3.5.1 Interface Mode Table2. Interface Modes

Если кодек в режиме мастера - он сам генерирует клоки и нужно им управлять через конфигурационные пины в зависимости от нужной частоты дискретизации.

Проверь еще что у тебя пин FMT (Pin 12) подтянут к земле - Low I2S, 24-bit

Еще смотри таблицу

Table 1. Sampling Frequency and System Clock Frequency

при фиксированной частоте тактирования (system clock) не все частоты дискретизации доступны - я не знаю как ты тактируешь кодек, для примера если частота тактирования 24.576 MHz тебе доступны 96kHz, 64kHz и 48kHz и запись из твоего примера

-r 16000

работать не будет или запишется хрень

anonymous ()
Ответ на: комментарий от anonymous

Версия о проблемах на стороне обвязки кодека не подтвердилась. Как проверили - подключили к pcm1808 ЦАП и вывели звук на колонки. Звук есть, нормальный, чистый. В альсе по-прежнему вместо звука каша, промодулированная звуком с мика.

Кодек находится в режиме мастера, тактирует его внешний кварц на частоте 12.288. Pin 12 пробовали и к земле и к плюсу, разницы не увидели.

-r 16000 это осталось от какого-то промежуточного варианта, сейчас записываю как arecord -d 10 -D plughw:0,1 -c2 -r 32000 -f S24_BE -t raw foobar.raw --disable-channels --disable-resample --disable-format -vvvv

При ручном анализе записанного потока возникла версия что из потока пропадает бит примерно раз в 80мс, а остальные биты сдвигаются.

leet27 ()
Последнее исправление: leet27 (всего исправлений: 1)
Ответ на: комментарий от leet27

Кодек находится в режиме мастера

судя по этому линку с которого ты копировал описание DT

http://community.onion.io/topic/3888/i2s-adc-headaches

процессорный интерфейс тоже мастер - он использует этот DAC

https://www.banggood.com/CJMCU-5102-PCM5102A-Stereo-DAC-Digital-To-Analog-Converter-PLL-Voice-Module-p-1270835.html

по даташиту он только слейвом работает. Так что естественно

Pin 12 пробовали и к земле и к плюсу, разницы не увидели.

ничего не меняет. Сделай кодек слейвом.

anonymous ()
Ответ на: комментарий от anonymous

Сделай кодек слейвом.

по правильному через DT указывают - кто мастер а кто слейв для битклока и фреймов, но с этими китайскими драйверописателями надеяться на правильную работу не приходится - лучше кодек через конфигурационные пины подстроить под то что хоть как-то работает :)

anonymous ()
Ответ на: комментарий от anonymous

Спасибо еще раз. А тебе не кажется, что проще будет перенастроить процессор на слейв? Ты не подскажешь, как это сделать? В мастер имхо будет тяжелее завести - переписать DT, перепаять железку и еще хрен знает что.

leet27 ()
Ответ на: комментарий от leet27

А тебе не кажется, что проще будет перенастроить процессор на слейв?

в том то и дело что это только кажется - может он вообще не поддерживает слейв режим, но попробуй так дописать


           simple-audio-card,dai-link@1{
               format = "i2s";
               bitclock-master = <&codec>;
               frame-master = <&codec>;
               cpu {
                   sound-dai = <&i2s>;
               };
               codec {
                   sound-dai = <&codec_in>;
               };
           };

или так


           simple-audio-card,dai-link@1{
               format = "i2s";
               cpu {
                   sound-dai = <&i2s>;
               };
               codec {
                   sound-dai = <&codec_in>;
                   frame-master;
                   bitclock-master;
               };
           };

чтобы кодек перевести на слейв - надо только 2 резистора перекинуть с +3.3 на землю, поэтому и предложил это чтобы DT не трогать

anonymous ()
Ответ на: комментарий от anonymous

чтобы кодек перевести на слейв - надо только 2 резистора перекинуть с +3.3 на землю, поэтому и предложил это чтобы DT не трогать

Разве не надо в DT добавлять что-то типа system-clock-frequency = <24576000>; в какую-то секцию? Меня пугает именно это добавление - не понимаю, куда его прописывать. Процу-то надо сказать, с какой частотой тактировать pcm1808, не?

leet27 ()
Ответ на: комментарий от leet27

Разве не надо в DT добавлять что-то типа system-clock-frequency = <24576000>

у тебя кодек неуправляемый и тактируется от своего генератора - не надо ему это.

anonymous ()
Ответ на: комментарий от leet27

Процу-то надо сказать, с какой частотой тактировать pcm1808, не?

ты же его не с проца тактируешь а своим генератором, процессор в режиме мастера генерирует битклок и фреймы в соотвтетсвии с частотой дискретизации которую ты из юзерспейс указываешь, а кодек работает так

[quote] The PCM1808 device has a system-clock detection circuit which automatically senses if the system-clock operation is at 256 f S , 384 f S , or 512 f S in slave mode. [/quote]

В режме когда кодек мастер он генерирует эти частоты в соотвтетсвии с тем что у тебя напаяно

[quote] In master mode, control of the system clock frequency must be through the serial control port, which uses MD1 (pin 11) and MD0 (pin 10). [/quote]

а процессору вообще пофиг в режиме слейва какая там частота на входе или у кодека- он просто данные защелкивает в сдвиговом регистре и в аппаратный FIFO кладет - контроллер DMA их потом из фифо в основную память перекидывает.

anonymous ()
Ответ на: комментарий от anonymous

Я должен тебе пиво. Второй вариант отсюда заработал. В очередной раз спасибо.

ты же его не с проца тактируешь а своим генератором

Вообще я думал, что если проц мастер, то именно он тактует. А что, можно и проц сделать мастером, и тактовать с внешнего кварца? А в чем тогда смысл мастер-слейв? Это я так, для общего развития спрашиваю.

leet27 ()
Последнее исправление: leet27 (всего исправлений: 1)
Ответ на: комментарий от leet27

А что, можно и проц сделать мастером, и тактовать с внешнего кварца?

у этого кодека можно - он сам синхронизируется

In slave mode, the PCM1808 device operates under LRCK (pin 7), synchronized with system clock SCKI (pin 6). The PCM1808 device does not require a specific phase relationship between LRCK and SCKI, but does require the synchronization of LRCK and SCKI. If the relationship between LRCK and SCKI changes more than ±6 BCKs for 64 BCK/frame (±5 BCKs for 48 BCK/frame) during one sample period due to LRCK or SCKI jitter, internal operation of the ADC halts within 1 / f S and digital output goes to zero data (BPZ code) until resynchronization between LRCK and SCKI occurs.

вообще надо смотреть документацию на конкретный кодек. С процессора тактируют чтобы схему упростить и цену устройства снизить.

anonymous ()
Ответ на: комментарий от anonymous

он сам синхронизируется

поспешил я с выводами

А что, можно и проц сделать мастером, и тактовать с внешнего кварца?

я понял это как кварцевый резонатор а у этого кодека нет своего PLL - нужно синхронизировать с мастером в режиме слейва через system clock, те тебе надо его как мастер использовать.

anonymous ()