Estoy usando Buildroot para construir un sistema Linux incorporado (2.6.39.2) para el microcontrolador NXP LPC3250.
En este momento, estoy tratando de poner en funcionamiento ALSA / ASoC, pero tengo algunos problemas para que los módulos funcionen juntos. (¡Yo creo que!)
Algunos antecedentes importantes:
La placa con la que estoy probando es la placa de desarrollo Embedded Artists 3250 V2 . V2 es diferente de V1 en que no tiene una pantalla LCD, pero incluye un códec de audio I2S: el NXP UDA1380. El soporte de placa para EA3250 V1 está incluido en la versión LPCLinux del núcleo. También hay una placa de desarrollo diferente, llamada Phytec 3250 , que contiene el mismo chip de códec UDA1380. La distribución LPCLinux también tiene soporte para la placa Phytec, junto con el chip de códec de audio. Por lo que he discernido, la placa Phytec 3250 tiene el códec UDA1380 en la dirección I2C 0x18 . En mi placa EA3250 V2, el códec de audio se encuentra en la dirección I2C 0x1a .(Verifiqué que el chip está encendido y puedo comunicarme con él usando el paquete de herramientas I2C. Responde a i2cdetect y puedo leer registros del chip correctamente usando i2cget).
Modificando la fuente:
Necesitaba editar los archivos del controlador Phytec 3250 para cambiar la dirección del chip de códec. Edité esta sección de lpc3xxx-uda1380.c :
static struct snd_soc_dai_link phy3250_uda1380_dai[] = {
{
.name = "uda1380",
.stream_name = "UDA1380 Duplex",
#if defined(CONFIG_SND_LPC32XX_USEI2S1)
.cpu_dai_name = "lpc3xxx-i2s1",
#else
.cpu_dai_name = "lpc3xxx-i2s0",
#endif
.codec_dai_name = "uda1380-hifi",
.init = phy3250_uda1380_init,
.platform_name = "lpc3xxx-audio.0",
//EDIT// .codec_name = "uda1380-codec.0-0018", //EDIT//
.codec_name = "uda1380-codec.0-001a",
.ops = &phy3250_uda1380_ops,
},
};
Después de hacer este cambio, seguí adelante y construí el sistema nuevamente y todo se compiló bien. Después de iniciar el sistema, tengo los siguientes módulos (además de los módulos básicos estándar) en /lib/modules/2.6.39.2/kernel/sound
:
./soc/codecs: snd-soc-uda1380.ko <-- ASoC codec driver
./soc/lpc3xxx: snd-soc-lpc3xxx-i2s.ko <-- ASoC DAI
snd-soc-lpc3xxx-uda1380.ko <-- ASoC machine driver
snd-soc-lpc3xxx.ko <-- ASoC platform driver
Ahora, ¿cómo puedo unir todo esto?
Simplemente insertando los módulos en modprobe
realidad no le da el dispositivo a ALSA / ASoC. No puedo detectar la tarjeta de sonido. ¿Esto significa que ahora debo hacer un nuevo dispositivo llamado uda1380-codec
en la dirección 0x1a y vincularlo a un controlador? Intenté hacer lo siguiente:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
y recibí:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Luego trato de vincular un controlador al dispositivo:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
y recibí:
sh: write error: No such device
¡recibo este error por todo lo que intento! Tengo la sensación de que no estoy creando el dispositivo correctamente, y luego no estoy seguro de cómo vincularlo con el controlador correcto.
Nota Bene:
Estaba jugando con esto anoche y de alguna manera pude hacer que ASoC se despertara y al menos buscar la tarjeta. Estaba jugando con diferentes enlaces, supongo. Era tarde y difícil recordar mis pasos, pero al menos pude obtener el siguiente error de alguna manera:
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
¡No he podido recrear este error!
Editar:
He confirmado que mi código modificado se está compilando, por lo que el controlador debería estar hablando con la dirección correcta ahora. Después de cargar manualmente los módulos, la salida de lsmod
es:
Module Size Used by Not tainted
snd_soc_lpc3xxx_uda1380 2087 0
snd_soc_lpc3xxx 3089 0
snd_soc_lpc3xxx_i2s 4089 1
snd_soc_uda1380 10865 0
snd_soc_core 51549 4 snd_soc_lpc3xxx_uda1380,snd_soc_lpc3xxx,snd_soc_lpc3xxx_i2s,snd_soc_uda1380
snd_pcm 52098 2 snd_soc_lpc3xxx,snd_soc_core
snd_timer 15590 1 snd_pcm
snd_page_alloc 3021 1 snd_pcm
snd 37286 3 snd_soc_core,snd_pcm,snd_timer
¿Esto se ve bien?
Y mi tabla de dispositivos:
# Audio stuff
/dev/audio c 666 0 29 14 4 - - -
#/dev/audio1 c 666 0 29 14 20 - - -
/dev/dsp c 666 0 29 14 3 - - -
#/dev/dsp1 c 666 0 29 14 19 - - -
#/dev/sndstat c 666 0 29 14 6 - - -
/dev/mixer c 666 0 29 14 0 - - -
/dev/snd d 755 0 29 - - - - -
/dev/snd/controlC0 c 666 0 29 116 0 - - -
/dev/snd/pcmC0D0c c 666 0 29 116 24 - - -
/dev/snd/pcmC0D0p c 666 0 29 116 16 - - -
/dev/snd/seq c 666 0 29 116 1 - - -
/dev/snd/timer c 666 0 29 116 33 - - -
fuente
alsa-devel
lista (donde se le informará que 2.6.39 está horriblemente desactualizado y que el proveedor de la junta es responsable del soporte).alsa-devel
y nadie respondió. (Que puedo decir, odio las listas de correo, son las peores para leer). Ahora mi buzón está lleno de basura de ALSA y todavía no tengo ayuda. Aquí voy otra vez, solo ...Respuestas:
Necesita editar el archivo de la placa que define los dispositivos de la plataforma. Necesitaba modificar
arch/arm/mach-lpc32xx/ea3250.c
:Agrega esto:
Edite esto para incluir el códec:
Ahora tengo todos los dispositivos:
aplay
Sin embargo, todavía no puedo detectar nada, pero tal vez sea un problema diferente.EDITAR: Sí, ese era un problema diferente. El número delante de los dispositivos que se muestra
cat devices
debe coincidir con el número de dispositivo Menor en las entradas de su dispositivo / dev / snd. Todo parece estar bien en ALSA ahora, pero no tengo datos I2S provenientes del LPC3250 ...EDIT2: SOLUCIONADO SOLUCIONADO SOLUCIONADO. Si no hay datos / reloj I2S, asegúrese de que el registro mux de salida esté configurado correctamente para conectar los pines de salida al periférico I2S.
fuente