NXP LPC3250 mikrodenetleyici için yerleşik bir Linux (2.6.39.2) sistemi oluşturmak için Buildroot kullanıyorum.
Şu anda ALSA / ASoC'yi çalıştırmaya çalışıyorum, ancak modüllerin birlikte çalışmasını sağlamakla ilgili bazı sorunlar yaşıyorum. (Bence!)
Bazı önemli bilgiler:
Test ettiğim pano Embedded Artists 3250 V2 geliştirme kartı . V2 bir LCD ekranı yok o V1 farklıdır, fakat içermez bir I2S ses codec'i: NXP UDA1380. EA3250 V1 için kart desteği , çekirdeğin LPCLinux sürümüne dahildir . Aynı UDA1380 kodek çipini içeren Phytec 3250 adlı farklı bir geliştirme kartı da var . LPCLinux dağıtımında ses kodek çipi ile birlikte Phytec kartı desteği de vardır. Ne fark ettiğimden, Phytec 3250 kartı UDA1380 kodek I2C adresi 0x18 vardır . EA3250 V2 kartımda, ses codec bileşeni I2C adresi 0x1a'da bulunur .(Çipin açıldığını doğruladım ve I2C araçları paketini kullanarak iletişim kurabilirim. İ2cdetect'e yanıt verir ve i2cget kullanarak çipteki kayıtları doğru bir şekilde okuyabilirim.)
Kaynağı değiştirme:
Codec yongasının adresini değiştirmek için Phytec 3250 sürücü dosyalarını düzenlemem gerekiyordu. Ben lpc3xxx-uda1380.c bu bölümünü düzenledi :
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,
},
};
Bu değişikliği yaptıktan sonra, sistemi tekrar kurdum ve her şey yoluna girdi. Sisteme önyükleme yaptıktan sonra, aşağıdaki modüller (standart çekirdek modüllere ek olarak) var /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
Şimdi, tüm bunları birbirine nasıl bağlarım?
Sadece modülleri takmak, modprobe
cihazı gerçekten ALSA / ASoC'ye vermez. Ses kartını tespit edemiyorum. Bu, şimdi 0x1auda1380-codec
adresinde yeni bir cihaz yapmam ve bir sürücüye bağlamam gerektiği anlamına mı geliyor ? Aşağıdakileri yapmayı denedim:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
ve
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
aldım : Sonra bir sürücüyü aygıta bağlamaya çalışıyorum:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
ve
sh: write error: No such device
aldım: Denediğim her şey için bu hatayı alıyorum! Aygıtı doğru bir şekilde oluşturmadığımı hissediyorum ve sonra doğru sürücüye nasıl bağlayacağımdan emin değilim.
Nota Bene:
Dün gece bununla oynuyordum ve bir şekilde ASoC'u uyandırabildim ve en azından kart için araştırdım. Farklı bağlarla oynuyordum sanırım. Adımlarımı hatırlamak geç ve zor oldu, ama en azından bir şekilde aşağıdaki hatayı alabildim:
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
Bu hatayı yeniden oluşturamadım!
Düzenle:
Değiştirilmiş kodumun derlendiğini onayladım, bu yüzden sürücü şimdi doğru adresle konuşuyor olmalı. Modülleri manuel olarak yükledikten sonra çıktısı 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
Bu doğru görünüyor mu?
Cihaz tablom:
# 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
ve kimse yanıt vermedi. (Söyleyebileceğim - Posta listelerinden nefret ediyorum, okumak en kötüsü.) Şimdi posta kutum ALSA bok dolu ve hala yardımım yok. İşte yine
alsa-devel
listede sormalısınız (burada 2.6.39'un çok eski olduğu ve pano satıcısının destekten sorumlu olduğu söylenecektir).