ALSA / ASoC: come caricare correttamente dispositivi / driver?


10

Sto usando Buildroot per costruire un sistema Linux (2.6.39.2) incorporato per il microcontrollore NXP LPC3250.

In questo momento, sto cercando di mettere in funzione ALSA / ASoC, ma ho dei problemi con il funzionamento dei moduli. (Credo!)

Alcuni retroscena importanti:

La scheda con cui sto testando è la scheda di sviluppo Embedded Artists 3250 V2 . V2 è diverso da V1 in quanto non ha uno schermo LCD, ma include un codec audio I2S: NXP UDA1380. Il supporto della scheda per EA3250 V1 è incluso nella versione LPCLinux del kernel. Esiste anche una scheda di sviluppo diversa, chiamata Phytec 3250 , che contiene lo stesso chip codec UDA1380. La distribuzione LPCLinux ha anche il supporto per la scheda Phytec, insieme al chip codec audio. Da quello che ho individuato, la scheda Phytec 3250 ha il codec UDA1380 sull'indirizzo I2C 0x18 . Sulla mia scheda EA3250 V2, il codec audio si trova all'indirizzo I2C 0x1a .(Ho verificato che il chip sia acceso e posso comunicarglielo usando il pacchetto I2C-tools. Risponde a i2cdetect e posso leggere correttamente i registri dal chip usando i2cget.)

Modifica della fonte:

Avevo bisogno di modificare i file del driver Phytec 3250 per cambiare l'indirizzo del chip codec. Ho modificato questa sezione di 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,
          },
  };

Dopo aver apportato questa modifica, sono andato avanti e ho creato di nuovo il sistema e tutto è stato compilato correttamente. Dopo l'avvio nel sistema, ho i seguenti moduli (oltre ai moduli core standard) in /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

Ora, come posso davvero unire tutte queste cose insieme?

Basta inserire i moduli con in modproberealtà non dà il dispositivo ad ALSA / ASoC. Non riesco a rilevare la scheda audio. Questo significa che ora devo creare un nuovo dispositivo chiamato uda1380-codecall'indirizzo 0x1a e collegarlo a un driver? Ho provato a fare quanto segue:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
e
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
ho ricevuto: Quindi ho provato a collegare un driver al dispositivo:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
e
sh: write error: No such device

ho ricevuto: Ottengo questo errore per tutto ciò che provo! Ho la sensazione di non creare correttamente il dispositivo, quindi non sono sicuro di come associarlo al driver corretto.

Nota bene:

Stavo giocando con quest'ultima sera ed è stato in qualche modo in grado di svegliare ASoC e almeno cercare la carta. Stavo giocando con diversi attacchi, immagino. Era tardi e difficile ricordare i miei passi, ma in qualche modo sono stato in grado di ottenere almeno il seguente errore:

uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22

Non sono stato in grado di ricreare questo errore!

Modificare:

Ho confermato che il mio codice modificato è in fase di compilazione, quindi il driver dovrebbe ora comunicare con l'indirizzo corretto. Dopo aver caricato manualmente i moduli, l'output di lsmodè:

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

Questo sembra giusto?

E la mia tabella dei dispositivi:

# 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      -       -       -

Dovresti leggere la documentazione ASoC e quindi chiedere sulla alsa-devellista (dove ti verrà detto che 2.6.39 è orribilmente obsoleto e che il fornitore di schede è responsabile del supporto).
CL.

@CL. Grazie, il fornitore di schede non supporta il codec UDA1380 con LPCLinux (li ho già contattati) , motivo per cui sto cercando di hackerarlo da solo.
dext0rb,

Ho postato alsa-devele nessuno ha risposto. (Che posso dire - odio le liste di posta, sono le peggiori da leggere.) Ora la mia casella di posta è piena di schifezze ALSA e ancora non ho aiuto. Eccomi di nuovo, da solo ...
dext0rb

Risposte:


3

È necessario modificare il file della scheda che definisce i dispositivi della piattaforma. Ho dovuto modificare arch/arm/mach-lpc32xx/ea3250.c:

Aggiungi questo:

/*
 * 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,
};

Modifica questo per includere il codec:

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

Ora ho tutti i dispositivi:

# 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

Non riesco ancora aplaya rilevare nulla, ma forse è un problema diverso.

EDIT: Sì, era un problema diverso. Il numero davanti ai dispositivi indicati da cat devicesdovrebbe corrispondere al numero del dispositivo minore nelle voci del tuo dispositivo / dev / snd. Adesso sembra tutto a posto su ALSA, ma non ho dati I2S provenienti dall'LPC3250 ...

EDIT2: RISOLTO RISOLTO RISOLTO. Se non ci sono dati / clock I2S, assicurarsi che il registro mux di uscita sia configurato correttamente per collegare i pin di uscita alla periferica I2S !!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.