ALSA / ASoC: ¿Cómo cargar correctamente los dispositivos / controladores?

10

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 modproberealidad 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-codecen 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 lsmodes:

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      -       -       -
dext0rb
fuente
Debe leer la documentación de ASoC y luego preguntar en la alsa-devellista (donde se le informará que 2.6.39 está horriblemente desactualizado y que el proveedor de la junta es responsable del soporte).
CL.
@CL. Gracias, el proveedor de la placa no es compatible con el códec UDA1380 con LPCLinux (ya me he puesto en contacto con ellos) , por eso estoy tratando de hackearlo.
dext0rb
Publiqué alsa-devely 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 ...
dext0rb

Respuestas:

3

Necesita editar el archivo de la placa que define los dispositivos de la plataforma. Necesitaba modificar arch/arm/mach-lpc32xx/ea3250.c:

Agrega esto:

/*
 * Platform Data for UDA1380 Audiocodec.
 * As there are no GPIOs for codec power & reset pins,
 * dummy GPIO numbers are used.
 */
static struct uda1380_platform_data uda1380_info = {
    .gpio_power = LPC32XX_GPIO(LPC32XX_GPO_P3_GRP,10),
    .gpio_reset = LPC32XX_GPIO(LPC32XX_GPO_P3_GRP,2),
    .dac_clk    = UDA1380_DAC_CLK_WSPLL,
};

Edite esto para incluir el códec:

static struct i2c_board_info __initdata ea3250_i2c_board_info [] = {
        {   I2C_BOARD_INFO("uda1380", 0x1a),
            .platform_data = &uda1380_info,
        }, 
#if defined (CONFIG_LEDS_PCA9532)
        {
            I2C_BOARD_INFO("pca9532", I2C_PCA9532_ADDR),
            .platform_data = &ea3250_leds,
        },
#endif
#if defined (CONFIG_FB_ARMCLCD)
        {
            /* 8Kb Configuration EEPROM on display board */
            I2C_BOARD_INFO("ea_i2c_disp_cfg", LCDB_CONFIG_EEPROM_I2C_ADDR),
        },
        {
            I2C_BOARD_INFO("ea_i2c_video", LCDB_PCA9532_I2C_ADDR),
        },
#endif
#if defined (CONFIG_EEPROM_AT24)
        {
            I2C_BOARD_INFO("24c256", I2C_24LC256_ADDR),
        },
#endif
    };
#endif

Ahora tengo todos los dispositivos:

# cat cards
 0 [LPC32XX        ]:  - LPC32XX
                      LPC32XX
# cat devices
  2: [ 0- 0]: digital audio playback
  3: [ 0- 0]: digital audio capture
  4: [ 0]   : control
 33:        : timer

# cat pcm
00-00: UDA1380 Duplex uda1380-hifi-0 :  : playback 1 : capture 1

aplaySin 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 devicesdebe 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.

dext0rb
fuente