LINUX.ORG.RU

Есть процессор imx8, нужно прописать звуковую карту на базе ESAI в dts.

прописывается не карта а аудио ЦАП/АЦП (или просто кодек) с интерфейсом чаще всего I2S с управлением чаще всего по I2C. ESAI это контроллер аудио интерфейсов в процессорах i.mx для подключения внешних кодеков, i2s поддерживает. Надо знать как кодек называется и на каких пинах процессора распаян. Просто берешь по примеру и прописываешь. Можно не писать machine driver а использовать прослойку simple-audio-card и описать аудиокарту полность через DTS - скорей всего ты имел ввиду.

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

Спасибо! Вы описали проблему абсолютно верно,но я пробывал simple-audio-card b и у меня происходит ошибка в парсинге dts относяшегося к simple-audio-card,cpu:

codec: codec {

     #sound-dai-cells = <0>;
     compatible = "dmic,dmic-codec";

};

sound {

   compatible = "simple-audio-card";

   simple-audio-card,name = "my-audio";

   simple-audio-card,format="i2s";

   simple-audio-card,mclk-fs = <64>;

   simple-audio-card,frame-master = <&sound2_esai>;

   simple-audio-card,bitclock-master = <&sound2_esai>;
   simple-audio-card,widgets =
                    "Microphone", "Mic Jack",
                    "Line", "Line In",
                    "Line", "Line Out",
                    "Headphone", "Headphone Jack";
   simple-audio-card,routing =
                    "DMIC AIF", "DMic";
                    mux-int-port = <1>;
                    mux-ext-port = <4>;
   sound2_esai: simple-audio-card,cpu {
                    sound-dai = <&esai1>;
                    system-clock-frequency = <3072000>;
                    dai-tdm-slot-num = <2>;
                    dai-tdm-slot-width = <32>;
   };

   sound2codec: simple-audio-card,codec {
                    sound-dai = <&codec_x28>;
   };

};

Также на форуме NXP мне сказали что они используют ESAI с кодеком cs42888:

sound {

compatible = "fsl,imx8qm-sabreauto-cs42888",
	 "fsl,imx-audio-cs42888";
model = "sound";
    esai-controller = <&esai1>;
audio-codec = <&codec>;
asrc-controller = <&asrc1>;
status = "okay";

};

codec_x28: codec_x28 {

     compatible = "dmic,dmic-codec";
     #sound-dai-cells = <0>;
     status="okay";

};

Но на самой борде у меня нет чипа cs42888, могу ли я использовать imx-audio-cs42888? При использовании imx-audio-cs42888 возникает ошибка:

[7.846]imx-cs42888 sound: failed to find codec platform device

[7.846]imx-cs42888: probe of sound failed with error -22

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

Но на самой борде у меня нет чипа cs42888

что вы пытаетесь подключить ? судя по DTS - PDM микрофон

https://source.codeaurora.org/external/imx/linux-imx/tree/Documentation/devic...

https://en.wikipedia.org/wiki/Pulse-density_modulation

а это совсем не ESAI/I2S нужно использовать

https://source.codeaurora.org/external/imx/linux-imx/tree/Documentation/devic...

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

Еще раз огромное спасибо за помощь, я просто застрял с этой проблемой. Я подключаю кастомный чип, который декодирует радиосигнал и передает звук на процессор imx8 через протокол I2S используя интерфейс ESAI на этом процессоре. А dmic я использую по аналогии с предыдущим устройством который был собран на imx6 с тем же чипом, на звук пердовался через I2S, но уже через интерфейс SII на процессоре.

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

Понятно - dmic вы используете в качетсве «тупого» кодека, но я не вижу где вы пины конфигурируете в DTS для esai1, интерфейс точно esai1 используется ? Плохо то что в референсных платах его не используют - не факт что ошибок нет в его описании. Еще я не понял откуда

        mux-int-port = <1>;
        mux-ext-port = <4>;

похоже на переключение аудиокомутатора, но разве он есть в этом процессоре ?

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

Подправил немного, у меня компилируется без ошибок, дописывал в arch/arm64/boot/dts/freescale/imx8qm-mek.dts

куски оригинального DTS «vdev3vring1: vdev1vring1@90118000 {» и «&adc0 {» - чтобы было понятно где дописывал

.....
		vdev3vring1: vdev1vring1@90118000 {
                        compatible = "shared-dma-pool";
			reg = <0 0x90118000 0 0x8000>;
			no-map;
		};
	};

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

		simple-audio-card,format="i2s";
		simple-audio-card,mclk-fs = <64>;
		simple-audio-card,frame-master = <&sound2_esai>;
		simple-audio-card,bitclock-master = <&sound2_esai>;

		simple-audio-card,widgets =
			"Microphone", "Mic Jack";

		simple-audio-card,routing =
			"DMic", "Mic Jack";

		sound2_esai: simple-audio-card,cpu {
			sound-dai = <&esai1>;
		};

		sound2_codec: simple-audio-card,codec {
			sound-dai = <&codec_x28>;
		};
	};

	codec_x28: codec-x28 {
		#sound-dai-cells = <0>;
		compatible = "dmic-codec";
		status = "okay";
	};
};

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

&adc0 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_adc0>;
.....

But alsa don't see this device through aplay -l

она должна его видеть через arecord -l

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

У меня есть плата на imx8m mini, попробовал на ней. Единственная разница - у меня SAI а не ESAI, модули simple-audio-card и dmic слинкованы с ядром статически

# dmesg | grep x28
[    1.251685] hx280enc: module inserted. Major <242>
[    1.762911] asoc-simple-card sound-x28: dmic-hifi <-> 30030000.sai mapping ok
[    1.799707]   #0: x28-audio

в списке записывающих устройств ALSA - card0

# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: x28audio [x28-audio], device 0: 30030000.sai-dmic-hifi dmic-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: imxspdif [imx-spdif], device 0: S/PDIF PCM snd-soc-dummy-dai-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

запись с card0, 2 канала, частота дискретизации 48000, формат со знаком 32 бита, стерео, 10 сек

# arecord -Dhw:0 -c2 -r48000 -fS32_LE -Vstereo -d10 -twav test.wav
Recording WAVE 'test.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo
spbob ()
Ответ на: комментарий от spbob

ESAI сконфигурирован в дтс след образом:

esai1: esai@59810000 {

	compatible = "fsl,imx8qm-esai";
	reg = <0x0 0x59810000 0x0 0x10000>;
	interrupts = <GIC_SPI 411 IRQ_TYPE_LEVEL_HIGH>;
	clocks = <&clk IMX8QM_AUD_ESAI_1_IPG>,
		<&clk IMX8QM_AUD_ESAI_1_EXTAL_IPG>,
		<&clk IMX8QM_AUD_ESAI_1_IPG>,
		<&clk IMX8QM_CLK_DUMMY>;
	clock-names = "core", "extal", "fsys", "spba";
	dmas = <&edma3 6 0 1>, <&edma3 7 0 0>;
	dma-names = "rx", "tx";
	status = "okay";
	power-domains = <&pd_esai1>;

};

Пины я неконфигурирую, тк по умолчанию они сконфигурированы как ESAI.

Не подскажите, xtor кодек можно его сделать использовать, я не особо понимаю разницу между xtor и dmiс например.

Freescale i.MX audio complex with Freescale DAI transceiver. Currently supports Freescale SAI or ESAI digital audio interface.

Required properties:

  • compatible : «fsl,imx-audio-xtor»

  • model : The user-visible name of this sound complex

  • cpu-dai : The phandle of the i.MX DAI, currently supports SAI or ESAI controller

Optional properties:

  • asrc-controller : The phandle of the i.MX ASRC controller associated with DAI.

Examples:

sound-xtor-sai { compatible = «fsl,imx-audio-xtor»; model = «xtor-audio-sai»; cpu-dai = <&sai0>; asrc-controller = <&asrc0>; };

sound-xtor-esai { compatible = «fsl,imx-audio-xtor»; model = «xtor-audio-esai»; cpu-dai = <&esai0>; };

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

моя версия- 4.14.78, а Вы какую используете?

Объявил как у Вас в arch/arm64/boot/dts/freescale/imx8qm-mek.dts полезли ошибки:

[ 7.799250] OF: /sound-x28/simple-audio-card,cpu: could not get #sound-dai-cells for /esai@59810000

[ 7.799257] asoc-simple-card sound-x28: parse error -22

[ 7.799269] asoc-simple-card: probe of sound-x28 failed with error -22

Мое объявление:

#include «fsl-imx8qm-mek.dtsi»

/{ sound-x28 { compatible = «simple-audio-card»; simple-audio-card,name = «x28-audio»;

	simple-audio-card,format="i2s";
	simple-audio-card,mclk-fs = <64>;
	simple-audio-card,frame-master = <&sound2_esai>;
	simple-audio-card,bitclock-master = <&sound2_esai>;

	simple-audio-card,widgets =
		"Microphone", "Mic Jack";

	simple-audio-card,routing =
		"DMic", "Mic Jack";

	sound2_esai: simple-audio-card,cpu {
		sound-dai = <&esai1>;
	};

	sound2_codec: simple-audio-card,codec {
		sound-dai = <&codec_x28>;
	};
};

codec_x28: codec-x28 {
	#sound-dai-cells = <0>;
	compatible = "dmic-codec";
	status = "okay";
};

};

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

Объявил как у Вас в arch/arm64/boot/dts/freescale/imx8qm-mek.dts полезли ошибки:

[ 7.799250] OF: /sound-x28/simple-audio-card,cpu: could not get #sound-dai-cells for /esai@59810000

обратите внимание как у меня проописана нода esai

&esai1{
>>>>	#sound-dai-cells = <0>; <<<<
	status = "okay";
};
spbob ()
Ответ на: комментарий от ziegfried

Спасибо, все отлично. Устройство обнаруживается:

card 2: x28audio [x28-audio], device 0: 59810000.esai-dmic-hifi dmic-hifi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0

Только при попытке захвата выдается ошибка:

root@imx8qmmek:~# arecord -Dhw:2 -c1 -r48000 -fS32_LE -Vstereo -d10 -twav test.wav

arecord: main:828: audio open error: No such device or address

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

Спасибо, все отлично. Устройство обнаруживается:

card 2: x28audio [x28-audio], device 0: 59810000.esai-dmic-hifi dmic-hifi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0

Только при попытке захвата выдается ошибка:

root@imx8qmmek:~# arecord -Dhw:2 -c1 -r48000 -fS32_LE -Vstereo -d10 -twav test.wav

arecord: main:828: audio open error: No such device or address

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

Единственное, я отключил партиции в SCFW, это может быть причиной ошибки?

на моём процессоре нет System Control Unit (SCU) - это надо на форуме NXP спрашивать, но по таким устройствам они только в приватном режиме консультируют. Мне изначально странным показалось что у них нигде не используется esai1. Поишите на форуме по ключевому слову esai1

https://community.nxp.com/t5/forums/searchpage/tab/message?advanced=false&amp...

может что полезное найдете

spbob ()
Последнее исправление: spbob (всего исправлений: 1)