ALSA / ASoC: Как правильно загрузить устройства / драйверы?


10

Я использую 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      -       -       -

Вы должны прочитать документацию ASoC, а затем спросить в alsa-develсписке (где вам скажут, что 2.6.39 ужасно устарел, и что ответственность за поддержку несет поставщик платы).
кл.

@CL. Спасибо, поставщик плат не поддерживает кодек UDA1380 с LPCLinux (я уже связался с ними) , поэтому я пытаюсь взломать его в себе.
dext0rb

Я отправил, alsa-develи никто не ответил. (Это я могу сказать - я ненавижу списки рассылки, они хуже всего читаются.) Теперь мой почтовый ящик полон дерьма ALSA, и я до сих пор не могу помочь. Здесь я снова, самостоятельно ...
dext0rb

Ответы:


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, но у меня нет данных I2S, поступающих с LPC3250 ...

EDIT2: решено решено решено. Если у вас нет данных / часов I2S, убедитесь, что выходной регистр мультиплексирования настроен правильно для подключения выходных контактов к периферийному устройству I2S !!!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.