ALSA / ASoC:如何正确加载设备/驱动程序?


10

我正在使用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      -       -       -

您应该阅读ASoC文档,然后在alsa-devel列表中询问(将告诉您2.6.39已经过时,并且主板供应商负责支持)。
CL。

@CL。谢谢,主板供应商不支持LPCLinux的UDA1380编解码器(我已经联系过他们),这就是为什么我试图自己破解它。
dext0rb

我张贴到alsa-devel,没有人回应。(我可以说-我讨厌邮件列表,它们是最难阅读的。)现在我的邮箱里塞满了ALSA废话,我仍然没有帮助。我自己一个人去这里……
dext0rb

Answers:


3

需要编辑定义平台设备的电路板文件。我需要修改arch/arm/mach-lpc32xx/ea3250.c

添加此:

/*
 * Platform Data for UDA1380 Audiocodec.
 * As there are no GPIOs for codec power & reset pins,
 * dummy GPIO numbers are used.
 */
static struct uda1380_platform_data uda1380_info = {
    .gpio_power = LPC32XX_GPIO(LPC32XX_GPO_P3_GRP,10),
    .gpio_reset = LPC32XX_GPIO(LPC32XX_GPO_P3_GRP,2),
    .dac_clk    = UDA1380_DAC_CLK_WSPLL,
};

编辑此内容以包含编解码器:

static struct i2c_board_info __initdata ea3250_i2c_board_info [] = {
        {   I2C_BOARD_INFO("uda1380", 0x1a),
            .platform_data = &uda1380_info,
        }, 
#if defined (CONFIG_LEDS_PCA9532)
        {
            I2C_BOARD_INFO("pca9532", I2C_PCA9532_ADDR),
            .platform_data = &ea3250_leds,
        },
#endif
#if defined (CONFIG_FB_ARMCLCD)
        {
            /* 8Kb Configuration EEPROM on display board */
            I2C_BOARD_INFO("ea_i2c_disp_cfg", LCDB_CONFIG_EEPROM_I2C_ADDR),
        },
        {
            I2C_BOARD_INFO("ea_i2c_video", LCDB_PCA9532_I2C_ADDR),
        },
#endif
#if defined (CONFIG_EEPROM_AT24)
        {
            I2C_BOARD_INFO("24c256", I2C_24LC256_ADDR),
        },
#endif
    };
#endif

现在我拥有所有设备:

# cat cards
 0 [LPC32XX        ]:  - LPC32XX
                      LPC32XX
# cat devices
  2: [ 0- 0]: digital audio playback
  3: [ 0- 0]: digital audio capture
  4: [ 0]   : control
 33:        : timer

# cat pcm
00-00: UDA1380 Duplex uda1380-hifi-0 :  : playback 1 : capture 1

我仍然无法aplay检测到任何东西,但这也许是另一个问题。

编辑:是的,那是一个不同的问题。显示的设备前面的数字cat devices应与/ dev / snd设备条目中的次设备号匹配。现在,在ALSA上一切似乎都很好,但是我没有来自LPC3250的I2S数据...

编辑2:已解决已解决。如果没有I2S数据/时钟,请确保正确配置了输出多路复用器寄存器,以将输出引脚连接到I2S外设!!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.