Tôi đang sử dụng Buildroot để xây dựng một hệ thống nhúng Linux (2.6.39.2) cho vi điều khiển NXP LPC3250.
Ngay bây giờ, tôi đang cố gắng để ALSA / ASoC hoạt động, nhưng tôi gặp một số vấn đề với việc làm cho các mô-đun hoạt động cùng nhau. (Tôi nghĩ!)
Một số nền tảng quan trọng:
Bảng tôi đang thử nghiệm là bảng phát triển Embedded Artists 3250 V2 . V2 khác với V1 ở chỗ nó không có màn hình LCD, nhưng bao gồm codec âm thanh I2S: NXP UDA1380. Hỗ trợ bảng cho EA3250 V1 được bao gồm trong phiên bản LPCLinux của kernel. Ngoài ra còn có một bảng phát triển khác, được gọi là Phytec 3250 , chứa cùng chip codec UDA1380. Bản phân phối LPCLinux cũng có hỗ trợ cho bảng Phytec, cùng với chip codec âm thanh. Từ những gì tôi đã nhận thấy, bảng Phytec 3250 có codec UDA1380 trên địa chỉ I2C 0x18 . Trên bảng EA3250 V2 của tôi, codec âm thanh được đặt tại địa chỉ I2C 0x1a .(Tôi đã xác minh chip được cấp nguồn và tôi có thể giao tiếp với nó bằng cách sử dụng gói công cụ I2C. Nó đáp ứng với i2cdetect và tôi có thể đọc các thanh ghi từ chip bằng i2cget.)
Sửa đổi nguồn:
Tôi cần chỉnh sửa các tệp trình điều khiển Phytec 3250 để thay đổi địa chỉ của chip codec. Tôi đã chỉnh sửa phần này của 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,
},
};
Sau khi tôi thực hiện thay đổi này, tôi đã tiếp tục và xây dựng hệ thống một lần nữa và mọi thứ được biên dịch OK. Sau khi khởi động vào hệ thống, tôi có các mô-đun sau (ngoài các mô-đun lõi tiêu chuẩn) trong /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
Bây giờ, làm thế nào để tôi thực sự liên kết tất cả những thứ này lại với nhau?
Chỉ cần chèn các mô-đun modprobe
mà không thực sự cung cấp thiết bị cho ALSA / ASoC. Tôi không thể phát hiện soundcard. Điều này có nghĩa là bây giờ tôi phải tạo một thiết bị mới được gọi uda1380-codec
tại địa chỉ 0x1a và liên kết nó với trình điều khiển? Tôi đã thử làm như sau:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
và nhận được:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Sau đó, tôi cố gắng ràng buộc trình điều khiển với thiết bị:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
và nhận được:
sh: write error: No such device
Tôi nhận được lỗi này cho mọi thứ tôi thử! Tôi có cảm giác tôi không tạo ra thiết bị một cách chính xác, và sau đó tôi không chắc làm thế nào để liên kết nó với trình điều khiển chính xác.
Ghi chú:
Tôi đã chơi với điều này tối qua và bằng cách nào đó có thể khiến ASoC thức dậy và ít nhất là thăm dò thẻ. Tôi đã chơi với các ràng buộc khác nhau, tôi đoán. Thật là muộn và khó nhớ các bước của tôi, nhưng ít nhất tôi đã có thể gặp phải lỗi sau:
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
Tôi đã không thể tạo lại lỗi này!
Biên tập:
Tôi đã xác nhận mã sửa đổi của mình đang được biên dịch, vì vậy trình điều khiển nên nói chuyện với địa chỉ chính xác ngay bây giờ. Sau khi tải thủ công các mô-đun, đầu ra của lsmod
là:
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
Điều này có đúng không?
Và bảng thiết bị của tôi:
# 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
và không ai trả lời. (Điều đó tôi có thể nói - Tôi ghét danh sách thư, chúng là thứ tồi tệ nhất để đọc qua.) Bây giờ hộp thư của tôi chứa đầy ALSA tào lao và tôi vẫn không có sự giúp đỡ. Tôi lại đi, một mình ...
alsa-devel
danh sách (nơi bạn sẽ được thông báo rằng 2.6,39 đã lỗi thời khủng khiếp và nhà cung cấp hội đồng quản trị có trách nhiệm hỗ trợ).