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 modprobe
realtà 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-codec
all'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 - - -
alsa-devel
e 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 ...
alsa-devel
lista (dove ti verrà detto che 2.6.39 è orribilmente obsoleto e che il fornitore di schede è responsabile del supporto).