Decodificador de audio extendido basado en NXP iMX6ULL MAX98357A
Colibri iMX6ULL es una computadora en módulo Arm lanzada por Toradex para dispositivos de bajo costo. No tiene un códec de audio y no puede emitir directamente señales de audio analógicas. Este artículo describe cómo ampliar el MAX98357A con la interfaz I2S de audio digital del módulo, incluido cómo configurar el árbol de dispositivos y la sincronización.
En el módulo Colibri iMX6ULL, el MAX98357A es una interfaz I2S de audio digital. El SoC i.MX 6ULL en el módulo Colibri iMX6ULL proporciona una interfaz de audio digital a través de la interfaz de interfaz de audio síncrona (SAI), que puede admitir AC97 o I2S para conectar códecs de audio externos. El MAX98357A es un decodificador de audio fácil de usar con un amplificador Clase D en chip. No se requiere configuración I2C ni reloj MCLK externo, lo que simplifica aún más el diseño del circuito. A continuación, instalamos el Colibri iMX6ULL utilizando el Colibri iMX6ULL y la placa de evaluación Colibri. ¿Placa de evaluación Colibri e instalación de Colibri iMX6ULL?Linux BSP 5.4?
El Colibri iMX6ULL tiene tres puertos SAI, el SAI2 se utiliza para conectarse al MAX98357A.
Según la conexión anterior, el árbol de dispositivos también se ha modificado en consecuencia. imx6ull-colibri-eval-v3.dtsi ¿Primero agregar un nodo codec_ext?
------------------------------------------------- ---- --
codec_ext: max98357a@0 {compatible = "maxim,max98357a";#sound-dai-cells = < ;0>;};
-- ---- ---------------------------------------
Luego agregue un sonido simple del nodo de la tarjeta de audio, donde sound-dai se refiere al codec_ext definido anteriormente.
-------------------- ------- ------------------
sonido {compatible = "tarjeta-de-audio-simple" estado = "bien"; tarjeta-audio-simple,nombre = "max98357a";tarjeta-audio-simple,formato = "i2s";tarjeta-audio-simple,bitclock-master=<&dailink_master_cpu>;tarjeta-audio-simple,frame-master=<&dailink_master_cpu >;tarjeta-de-audio simple, códec {sound-dai=<&codec_ext>;};dailink_master_cpu: tarjeta-de-audio-simple, bitclock-master = <&dailink_cpu cpu: tarjeta-de-audio-simple,cpu {sound-dai = <&sai2 >;};};
------------------------------------- ---------- -
El sonido anterior nodo, por lo que ?sai2 debe inicializarse a continuación.
------------------------------------------------- ---- --
&sai2 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_sai2>. relojes-asignados = <&clks IMX6UL_CLK_SAI2_SEL>,?<&clks IMX6UL_CLK_PLL4_AUDIO_DIV> relojes-asignados padre = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV> Frecuencia de reloj asignada = <2>, <196608000>; fsl,sai-asynchronous;/*fsl,sai-mclk-direction-output;*/status = "ok";};
--- --------------------- ---------------------
Aquí hay varios parámetros clave. pinctrl_sai2 configura las relaciones de multiplexación de pines. Para el MAX98357A, en realidad solo se requieren los primeros tres pines, como se muestra en la tabla anterior. ¿MX6UL_PAD_JTAG_TMS__SAI2_MCLK? y MX6UL_PAD_JTAG_TMS__CCM_CLKO1. ¿Estos dos son en realidad el mismo pin, pero la selección de funciones de multiplexación es diferente?
fsl,sai-mclk-direction-output;?¿El nodo de sonido? en el parámetro también se usa para probar SAI_MCLK?¿El parámetro también se usa para probar la salida SAI de MCLK? y la salida SAI MCLK? Esta señal no se utiliza para MAX98357A.
--------------------------------------- ---- --
pinctrl_sai2: SAI2GRP {fsl,pins = <MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK 0x1F089MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC 0x17088MX6UL _PAD_JTAG_TRST_B__SAI2_TX_DATA 0x11088 6UL_PAD_JTAG_TMS__SAI2_MCLK 0x17088*/MX6UL_PAD_JTAG_TMS__CCM_CLKO1 ?0x17088>;};};};
-- ------------------------------------------
Allí También hay tres propiedades importantes en el nodo de sonido, a saber, el reloj de asignación, el nodo principal del reloj de asignación y la velocidad del reloj de asignación. Antes de presentar estas propiedades, echemos un vistazo breve al Módulo controlador de reloj (CCM) del iMX6ULL.
El CCM es responsable de generar y controlar las señales de reloj necesarias para ejecutar varios módulos en el iMX6ULL, desde el núcleo de la CPU Arm hasta varios periféricos como USB, audio, red y más. Dado que cada módulo requiere un reloj diferente de alta a baja frecuencia, el CCM tiene múltiples PLL internos y divisores para proporcionar señales de reloj en varias frecuencias. Para el módulo SAI utilizado en este ejemplo, según el manual del chip iMX6ULL, su relación de reloj es la siguiente Figura 18-2. Árbol de reloj - Parte 1.
SAI2_CLK_ROOT puede seleccionar tres fuentes de reloj: PLL3, PLL4 y PLL5 a través de MUX. Entre estas tres fuentes de reloj, habrá múltiples divisores con diferente número de bits que degradarán la salida de reloj más alta del PLL a una frecuencia más baja. Estos divisores no requieren configuración manual; el controlador CCM calcula automáticamente la relación de división adecuada en función de la frecuencia de salida deseada.
Para archivos de audio, se puede calcular el reloj de bits requerido. Por ejemplo, para un archivo de audio de dos canales, 16 bits y frecuencia de muestreo de 48K, reloj de bits = 16x2x48000 = 1536000. Este valor es el reloj objetivo final que necesitamos. Según el diagrama anterior, el reloj de bits proviene del PLL4 y, según la sección 18.5.1.3.4 del manual del chip iMX6ULL, el PLL de audio/vídeo tiene un rango de frecuencia de 650 MHz a 1,3 GHz. Usando base 1536000 y redondeando al entero más cercano 512, obtenemos 786432000. 786432000. En otras palabras, 786432000 dividido por 512 veces puede producir una señal de reloj de 1536000 bits. En este punto, revisemos algunas de las propiedades del reloj en el nodo "sai2".
------------------------------------------------- ---- --
Frecuencias de reloj asignadas = <2>,
-------------------- --------------------- --
¿IMX6UL_CLK_SAI2_SEL? ¿Establecer SAI2_CLK_SEL en el registro CCM_CSCMR1? "2", se seleccionará PLL4 como fuente de reloj. Seleccione PLL4 como fuente de reloj. IMX6UL_CLK_PLL4_AUDIO_DIV es el reloj dividido de PLL4 y está configurado en 19660800, que es 24 veces de 1536000. El valor de PLL4 antes de la división de frecuencia es 786432000, que es 4 veces el valor de IMX6UL_CLK_PLL4_AUDIO_DIV, y su rango de frecuencia es de 650 MHz a 1,3 GHz.
Después de completar las modificaciones del árbol de dispositivos anteriores, vuelva a compilar y actualizar a iMX6ULL. El siguiente comando sobrescribirá directamente el archivo dtb original en el módulo.
------------------------------------------------- ---- --
root@colibri-imx6ull:~# ubiupdatevol /dev/ubi0_1 imx6ull-colibri-eval-v3
--------. ----- ----------------------------------
Después de reiniciar, Puede ver el dispositivo de audio max98357a.
------------------------------------------------- ---- --
root@colibri-imx6ull:~# aplay -l**** Lista de dispositivos de hardware de REPRODUCCIÓN ****tarjeta 0: max98357a [max98357a], dispositivo 0: 202c000. sai-HiFi HiFi -0 []?Subdispositivos: 1/1? Subdispositivo #0: Subdispositivo #0
-------------------------- ----- ----- ------
Al mismo tiempo, también puedes ver el reloj relacionado con sai2 en el árbol del reloj. Salidas pll4 786432000, salida dividida en 4 pll4_audio_div 196608000Hz. Después del MUX, se divide por 4 para generar 49152000 Hz y luego se divide por 2 para generar SAI2_CLK_ROOT de 24576000 Hz para proporcionar una señal de reloj para el funcionamiento del módulo SAI2.
------------------------------------------------- ---- --
root@colibri-imx6ull:~# cat /sys/kernel/debug/clk/clk_summarypll4 ?0 0 ?786432000 ?0 0 ?50000pll4_bypass 0 0 0 ?786432000 ?0 0 ?50000?pll4_audio ?0 0 0 0 ?786432000 ?0 0 ?50000?pll4_post_div 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ?50000pll4_ audio_div 0 0 0 0 ?196608000 ?0 0 ?50000sai2_sel ?0 0 0 ?196608000 ?0 0 ?50000?sai2_pred ?0 0 0 49152000 ?0 0 ?50000?sai2_podf ?0 0 0 0 24576000 ?0 0 0 ?50000sai2 0 0 24576000 ?0 0 ?500 00
------------------------------------------------- --
CCM proporciona dos pines: CCM_CLKO1 - CCM_CLKO2 - CCM_CLKO1 y - CCM_CLKO2 - CCM_CLKO2 que pueden generar el reloj relevante para realizar pruebas.
Según el bit CLKO2_SEL del registro CCM_CCOSR, sai2_clk_root se encuentra en CCM_CLKO2, mientras que el bit CLK_OUT_SEL permite que CCM_CLKO1 o CCM_CLKO2 se generen en CCM_CLKO1. Por lo tanto, CCM_CLKO1 se puede habilitar escribiendo 0x01130180 en el registro CCM_CCOSR en el pin 71 del módulo SODIMM y emitiendo la señal sai2_clk_root. Ejecute el siguiente comando en iMX6ULL
---------------------------------- --- --------
root@colibri-imx6ull:~# devmem2 0x020c4060 w 0x01130180
------------- --- -----------------------
Utilice el siguiente comando para reproducir doble canal, 16 bits, 48K archivo de audio de frecuencia de muestreo, midiendo la salida de forma de onda en el pin 71 de SODIMM.
------------------------------------------------- ---- --
root@colibri-imx6ull:~# aplay -D sysdefault:CARD=max98357a LRMonoPhase4.wav -vv
--------- ---- --------------------------------
En la imagen de arriba puedes ver la frecuencia de la forma de onda es de 24,5 MHz, que es el reloj generado por PLL4 después de múltiples divisiones de frecuencia.
Reproduzca nuevamente el archivo de audio anterior y mida la señal de reloj de bits de SODIMM 31 y la señal de sincronización de cuadro de SODIMM 23.
El reloj de bits es de 1,53 MHz y la sincronización de fotogramas es de 48 KHz, que es el mismo valor del reloj de bits calculado anteriormente para audio de dos canales, 16 bits y frecuencia de muestreo de 48 K. La salida real de estas señales es la esperada. Si habilita la función de salida del registro de depuración del controlador SAI, puede encontrar información adicional después de reproducir el archivo de audio. En el código fuente del controlador SAI, agregue #define DEBUG a la primera línea y luego vuelva a compilar zImage.
-------------------- -- ------------------------
[ ?49.838293] fsl-sai 202c000.sai : clk_rate 0 Hz, ?mclk_clk id 0 [?49.838316] fsl-sai 202c000.sai: clk_rate 24576000 Hz, ?mclk_clk id 1 [?49.838328] fsl-sai 202c000.sai: velocidad 16 basada en reloj 24576000 Hz frecuencia 1536000 Hz [?49. 51]fsl-sai 202c000 .sai: Mejor ajuste: ID de reloj=1, relación=16, sesgo=0
------------------- ---- -- ---------------------
El "reloj de bits" de 1536000 Hz se obtiene dividiendo 16 por 24576000 Hz. Los últimos 7 bits del DIV en el registro I2S2_TCR2 (dirección 0x0202c008) se utilizan para configurar este divisor. El valor de la división de frecuencia es (DIV + 1)x2. Cuando el valor DIV del registro leído es 7, se realiza una división por 16. Esto corresponde al registro de depuración del controlador SAI descrito anteriormente. "Relación 16 basada en la frecuencia 1536000Hz basada en el reloj 24576000Hz".
------------------------------------------------- ---- --
root@colibri-imx6ull:~# devmem2 0x0202c008 w/dev/mem open.Memoria asignada en la dirección 0x76f4b000.Leer en la dirección ?0x0202C008 (0x76f4b008): 0x07000007
- ---------------------------------------------- -
Finalmente, conecte el MAX98357A y el altavoz, y podrá escuchar el archivo de audio que se reproduce.
/v_show/id_XNTgzMjUxMTg2NA==.html
Resumen
Al ampliar el MAX98357A, presentamos cómo funciona el controlador de audio SAI iMX6 ULL SoC y cómo configurar el dispositivo. árboles y métodos de prueba. Con este enfoque, los usuarios también pueden ampliar otros códecs de audio basados en I2S.