Я использую 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-tools. Он отвечает на 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 ужасно устарел, и что ответственность за поддержку несет поставщик платы).