Я використовую Buildroot для створення вбудованої системи Linux (2.6.39.2) для мікроконтролера NXP LPC3250.
Зараз я намагаюся активувати ALSA / ASoC, але у мене виникають проблеми з тим, щоб модулі працювати разом. (Я думаю!)
Деякі важливі відомості:
Дошка, з якою я тестую, - це плата розробки Embedded Artists 3250 V2 . V2 відрізняється від V1 тим, що у нього немає РК-екрана, але він включає аудіокодек I2S: NXP UDA1380. Підтримка плати для EA3250 V1 включена у версію LPCLinux ядра. Існує також інша плата розробки під назвою Phytec 3250 , яка містить той же чіп кодека UDA1380. У дистрибутиві LPCLinux також є підтримка плати Phytec, а також чіп аудіо кодеків. Як я зрозумів, плата Phytec 3250 має кодек UDA1380 за адресою I2C 0x18 . На моїй платі EA3250 V2 аудіокодек знаходиться за адресою I2C 0x1a .(Я перевірив, чип включений, і я можу спілкуватися з ним за допомогою пакета інструментів I2C. Він відповідає на i2cdetect, і я можу правильно читати регістри з чіпа за допомогою i2cget.)
Змінення джерела:
Мені потрібно було відредагувати файли драйверів Phytec 3250, щоб змінити адресу чіпа кодека. Я відредагував цей розділ 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,
},
};
Після внесення цієї зміни я пішов вперед і знову створив систему і все складено в порядку. Після завантаження в систему я маю наступні модулі (крім стандартних основних модулів) у /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
Тепер, як я насправді пов’язую всі ці речі разом?
Просто вставлення модулів за допомогою modprobe
насправді не дає пристрою ALSA / ASoC. Я не в змозі виявити звукову карту. Чи означає це, що я повинен зараз створити новий пристрій, який називається uda1380-codec
за адресою 0x1a, і зв’язати його з драйвером? Я спробував зробити наступне:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
і отримав:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Потім я намагаюся прив’язати драйвер до пристрою:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
і отримав:
sh: write error: No such device
я отримую цю помилку за все, що намагаюся! У мене є відчуття, що я не створюю пристрій правильно, і тоді я не знаю, як його прив’язати до правильного драйвера.
Nota Bene:
Я грав у цю минулу ніч і якось зміг змусити ASoC прокинутися і хоча б пробувати карту. Я грала з різними прив’язками, я думаю. Мені було пізно і важко запам'ятати мої кроки, але мені вдалося якось отримати таку помилку:
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
Я не зміг відновити цю помилку!
Редагувати:
Я підтвердив, що мій модифікований код збирається, тому драйвер повинен говорити з правильною адресою зараз. Після завантаження модулів вручну, вихід 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
Це правильно виглядає?
І моя таблиця пристроїв:
# 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
і ніхто не відповів. (Що я можу сказати - я ненавиджу поштові списки, вони найгірші для прочитання.) Зараз моя поштова скринька повна ALSA лайно, і я все ще не маю допомоги. Ось я знову йду сам по собі ...
alsa-devel
списку (де вам скажуть, що 2.6.39 жахливо застарів і що постачальник плати відповідає за підтримку).