Ich verwende Buildroot, um ein eingebettetes Linux-System (2.6.39.2) für den NXP LPC3250-Mikrocontroller zu erstellen.
Im Moment versuche ich, ALSA / ASoC zum Laufen zu bringen, aber ich habe einige Probleme damit, dass die Module zusammenarbeiten. (Meiner Ansicht nach!)
Einige wichtige Hintergründe:
Das Board, mit dem ich teste, ist das Embedded Artists 3250 V2-Entwicklungsboard . V2 unterscheidet sich von V1, dass sie nicht über einen LCD - Bildschirm verfügt, sondern enthält einen I2S - Audiocodec: Der NXP UDA1380. Die Board-Unterstützung für EA3250 V1 ist in der LPCLinux- Version des Kernels enthalten. Es gibt auch ein anderes Entwicklungsboard namens Phytec 3250 , das denselben UDA1380-Codec-Chip enthält. Die LPCLinux-Distribution unterstützt neben dem Audio-Codec-Chip auch die Phytec-Karte. Soweit ich festgestellt habe, verfügt die Phytec 3250-Karte über den UDA1380-Codec an der I2C-Adresse 0x18 . Auf meiner EA3250 V2-Karte befindet sich der Audio-Codec unter der I2C-Adresse 0x1a .(Ich habe überprüft, ob der Chip eingeschaltet ist, und kann über das I2C-Tools-Paket mit ihm kommunizieren. Er reagiert auf i2cdetect und kann mit i2cget die Register korrekt vom Chip lesen.)
Ändern der Quelle:
Ich musste die Phytec 3250-Treiberdateien bearbeiten, um die Adresse des Codec-Chips zu ändern. Ich habe diesen Abschnitt von lpc3xxx-uda1380.c bearbeitet :
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,
},
};
Nachdem ich diese Änderung vorgenommen hatte, baute ich das System erneut auf und alles wurde in Ordnung kompiliert. Nach dem Booten in das System habe ich die folgenden Module (zusätzlich zu den Standard-Kernmodulen) 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
Wie binde ich das ganze Zeug zusammen?
Das Einfügen der Module mit modprobe
gibt das Gerät nicht an ALSA / ASoC weiter. Ich kann die Soundkarte nicht erkennen. Bedeutet dies, dass ich jetzt ein neues Gerät uda1380-codec
mit der Adresse 0x1a erstellen und es an einen Treiber binden muss? Ich habe Folgendes versucht:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
und erhalten:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Dann versuche ich, einen Treiber an das Gerät zu binden:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
und erhalten:
sh: write error: No such device
Ich erhalte diesen Fehler für alles, was ich versuche! Ich habe das Gefühl, dass ich das Gerät nicht richtig erstelle, und bin mir dann nicht sicher, wie ich es an den richtigen Treiber binden soll.
Nota Bene:
Ich habe letzte Nacht damit gespielt und war irgendwie in der Lage, ASoC zum Aufwachen zu bringen und zumindest nach der Karte zu suchen. Ich habe mit verschiedenen Bindungen gespielt, denke ich. Es war spät und schwer, sich an meine Schritte zu erinnern, aber ich konnte zumindest irgendwie den folgenden Fehler bekommen:
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
Ich konnte diesen Fehler nicht wiederherstellen!
Bearbeiten:
Ich habe bestätigt, dass mein geänderter Code kompiliert wird, daher sollte der Treiber jetzt mit der richtigen Adresse sprechen. Nach dem manuellen Laden der Module lsmod
lautet die Ausgabe von :
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
Sieht das richtig aus?
Und meine Gerätetabelle:
# 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 - - -
quelle
alsa-devel
Liste nachfragen (wo Ihnen mitgeteilt wird, dass 2.6.39 schrecklich veraltet ist und der Board-Anbieter für den Support verantwortlich ist).alsa-devel
und niemand hat geantwortet. (Das kann ich sagen - ich hasse Mail-Listen, sie sind am schlechtesten zu lesen.) Jetzt ist meine Mailbox voller ALSA-Mist und ich habe immer noch keine Hilfe. Hier gehe ich wieder alleine ...Antworten:
Sie müssen die Datei des Boards bearbeiten, die Plattformgeräte definiert. Ich musste ändern
arch/arm/mach-lpc32xx/ea3250.c
:Füge das hinzu:
Bearbeiten Sie dies, um den Codec einzuschließen:
Jetzt habe ich alle Geräte:
Ich kann noch
aplay
nichts erkennen, aber vielleicht ist das ein anderes Problem.EDIT: Ja, das war ein anderes Thema. Die Nummer vor den von angezeigten Geräten
cat devices
sollte mit der Minor-Gerätenummer in Ihren / dev / snd-Geräteeinträgen übereinstimmen. Am Ende von ALSA scheint jetzt alles gut zu sein, aber ich habe keine I2S-Daten vom LPC3250 ...EDIT2: Gelöst Gelöst Gelöst Gelöst. Wenn Sie keine I2S-Daten / Uhr haben, stellen Sie sicher, dass das Ausgangs-Mux-Register richtig konfiguriert ist, um die Ausgangspins mit dem I2S-Peripheriegerät zu verbinden !!!
quelle