Używam Buildroot do budowy wbudowanego systemu Linux (2.6.39.2) dla mikrokontrolera NXP LPC3250.
W tej chwili próbuję uruchomić ALSA / ASoC, ale mam pewne problemy z zapewnieniem współpracy modułów. (Myślę!)
Niektóre ważne tło:
Płytka, z którą testuję, to płytka rozwojowa Embedded Artists 3250 V2 . V2 różni się od V1 tym, że nie ma ekranu LCD, ale zawiera kodek audio I2S: NXP UDA1380. Obsługa płytki EA3250 V1 jest zawarta w wersji jądra LPCLinux . Istnieje również inna płytka rozwojowa, o nazwie Phytec 3250 , która zawiera ten sam układ kodeków-dekoderów UDA1380. Dystrybucja LPCLinux obsługuje również płytę Phytec wraz z układem kodeków audio. Z tego, co zauważyłem, płyta Phytec 3250 ma kodek UDA1380 na adres I2C 0x18 . Na mojej płytce EA3250 V2 kodek audio znajduje się pod adresem I2C 0x1a .(Sprawdziłem, czy układ jest zasilony i mogę się z nim komunikować za pomocą pakietu narzędzi I2C. Odpowiada na i2cdetect i mogę poprawnie odczytywać rejestry z układu za pomocą i2cget.)
Modyfikowanie źródła:
Musiałem edytować pliki sterownika Phytec 3250, aby zmienić adres układu kodeka. Zredagowałem tę sekcję 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,
},
};
Po wprowadzeniu tej zmiany poszedłem dalej i zbudowałem system ponownie, a wszystko skompilowało się OK. Po uruchomieniu w systemie mam następujące moduły (oprócz standardowych modułów podstawowych) w /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
W jaki sposób mogę połączyć te wszystkie rzeczy razem?
Samo wstawienie modułów modprobe
nie daje urządzenia ALSA / ASoC. Nie mogę wykryć karty dźwiękowej. Czy to oznacza, że muszę teraz utworzyć nowe urządzenie o nazwie uda1380-codec
pod adresem 0x1a i powiązać je ze sterownikiem? Próbowałem wykonać następujące czynności:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
i otrzymałem:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Następnie próbuję powiązać sterownik z urządzeniem:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
i otrzymałem:
sh: write error: No such device
Otrzymuję ten błąd za wszystko, co próbuję! Mam wrażenie, że nie tworzę urządzenia poprawnie, a następnie nie jestem pewien, jak powiązać je z odpowiednim sterownikiem.
Nota Bene:
Bawiłem się tą ostatnią nocą i jakoś udało mi się zmusić ASoC do przebudzenia i przynajmniej sprawdzenia karty. Chyba grałem z różnymi powiązaniami. Było późno i trudno było zapamiętać moje kroki, ale udało mi się przynajmniej uzyskać następujący błąd:
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
Nie udało mi się odtworzyć tego błędu!
Edytować:
Potwierdziłem, że mój zmodyfikowany kod jest kompilowany, więc sterownik powinien teraz rozmawiać z poprawnym adresem. Po ręcznym załadowaniu modułów wynikiem lsmod
jest:
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
Czy to wygląda dobrze?
A moja tabela urządzeń:
# 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
i nikt nie odpowiedział. (Mogę powiedzieć - nienawidzę list mailowych, są najgorsze do przeczytania.) Teraz moja skrzynka jest pełna gówna ALSA i nadal nie mam pomocy. Znowu idę sam…
alsa-devel
liście (gdzie dowiesz się, że 2.6.39 jest strasznie nieaktualny i że dostawca płyty jest odpowiedzialny za wsparcie).