我正在使用Buildroot为NXP LPC3250微控制器构建嵌入式Linux(2.6.39.2)系统。
现在,我正在尝试启动和运行ALSA / ASoC,但是在使模块协同工作方面存在一些问题。(我认为!)
一些重要的背景:
我正在测试的板是Embedded Artists 3250 V2开发板。V2与V1的不同之处在于,它没有LCD屏幕,但包含 I2S音频编解码器:NXP UDA1380。LPCLinux版本的内核包含对EA3250 V1的主板支持。还有一个名为Phytec 3250的不同开发板,其中包含相同的UDA1380编解码器芯片。LPCLinux发行版还支持Phytec板以及音频编解码器芯片。据我所知,Phytec 3250开发板在I2C地址0x18上具有UDA1380编解码器。在我的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已经过时,并且主板供应商负责支持)。