Saya menggunakan Buildroot untuk membangun sistem Linux tertanam (2.6.39.2) untuk mikrokontroler NXP LPC3250.
Saat ini, saya sedang mencoba untuk menjalankan dan menjalankan ALSA / ASoC, tapi saya mengalami beberapa masalah dengan membuat modul untuk bekerja bersama. (Kupikir!)
Beberapa latar belakang penting:
Papan yang saya uji adalah papan pengembangan Embedded Artists 3250 V2 . V2 berbeda dari V1 karena tidak memiliki layar LCD, tetapi menyertakan codec audio I2S: The NXP UDA1380. Dukungan board untuk EA3250 V1 termasuk dalam versi LPCLinux dari kernel. Ada juga papan pengembangan yang berbeda, yang disebut Phytec 3250 , yang berisi chip codec UDA1380 yang sama. Distribusi LPCLinux juga memiliki dukungan untuk papan Phytec, bersama dengan chip codec audio. Dari apa yang saya lihat, board Phytec 3250 memiliki codec UDA1380 pada alamat I2C 0x18 . Di papan EA3250 V2 saya, codec audio terletak di alamat I2C 0x1a .(Saya telah memverifikasi bahwa chip dinyalakan, dan saya dapat berkomunikasi dengannya dengan menggunakan paket I2C-tools. Ia merespon i2cdetect dan saya dapat membaca register dari chip dengan benar menggunakan i2cget.)
Memodifikasi sumber:
Saya perlu mengedit file driver Phytec 3250 untuk mengubah alamat chip codec. Saya mengedit bagian lpc3xxx-uda1380.c ini :
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,
},
};
Setelah saya melakukan perubahan ini, saya melanjutkan dan membangun sistem lagi dan semuanya terkompilasi dengan baik. Setelah boot ke sistem, saya memiliki modul berikut (selain modul inti standar) di /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
Sekarang, bagaimana saya benar-benar mengikat semua ini bersama?
Hanya memasukkan modul dengan modprobe
tidak benar-benar memberikan perangkat ke ALSA / ASoC. Saya tidak dapat mendeteksi kartu suara. Apakah ini berarti saya sekarang harus membuat perangkat baru bernama uda1380-codec
address 0x1a dan mengikatnya ke driver? Saya telah mencoba melakukan hal berikut:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
dan menerima:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Kemudian saya mencoba mengikat driver ke perangkat:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
dan menerima:
sh: write error: No such device
Saya mendapatkan kesalahan ini untuk semua yang saya coba! Saya merasa saya tidak membuat perangkat dengan benar, dan kemudian saya tidak yakin bagaimana cara mengikatnya ke driver yang benar.
Nota bene:
Saya bermain dengan ini tadi malam dan entah bagaimana bisa membuat ASoC bangun dan setidaknya memeriksa kartunya. Saya bermain dengan binding yang berbeda, saya kira. Terlambat dan sulit untuk mengingat langkah saya, tetapi saya setidaknya bisa mendapatkan kesalahan berikut:
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
Saya tidak dapat membuat ulang kesalahan ini!
Edit:
Saya telah mengkonfirmasi kode saya yang dimodifikasi sedang dikompilasi, jadi pengemudi harus berbicara dengan alamat yang benar sekarang. Setelah memuat modul secara manual, output dari lsmod
adalah:
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
Apakah ini terlihat benar?
Dan tabel perangkat saya:
# 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 - - -
sumber
alsa-devel
daftar (di mana Anda akan diberitahu bahwa 2.6.39 sudah usang, dan vendor papan bertanggung jawab atas dukungan).alsa-devel
dan tidak ada yang merespons. (Yang bisa saya katakan - Saya benci mail-list, mereka adalah yang terburuk untuk dibaca.) Sekarang kotak surat saya penuh dengan omong kosong ALSA dan saya masih tidak memiliki bantuan. Ini dia lagi, sendiri ...Jawaban:
Perlu mengedit file papan yang mendefinisikan perangkat platform. Saya perlu memodifikasi
arch/arm/mach-lpc32xx/ea3250.c
:Tambahkan ini:
Edit ini untuk memasukkan codec:
Sekarang saya memiliki semua perangkat:
Saya belum bisa
aplay
mendeteksi apa pun, tapi mungkin itu masalah yang berbeda.EDIT: Ya, itu masalah yang berbeda. Nomor di depan perangkat yang ditunjukkan oleh
cat devices
harus sesuai dengan nomor perangkat Minor di entri perangkat / dev / snd Anda. Segalanya tampak bagus di akhir ALSA sekarang, tapi saya tidak punya data I2S yang berasal dari LPC3250 ...EDIT2: ASK ASK ASK. Jika Anda tidak memiliki data / jam I2S, pastikan register mux output dikonfigurasikan dengan benar untuk menghubungkan pin output ke perangkat I2S !!!
sumber