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. Він відповідає на 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поки що нічого не можу виявити, але, мабуть, це інша проблема.

EDIT: Так, це було інше питання. Номер перед пристроями, показаними на, cat devicesповинен відповідати міноровому номеру пристрою у ваших записах / dev / snd. Зараз на завершенні ALSA все здається гарним, але у мене немає даних про I2S, що надходять із LPC3250 ...

EDIT2: РЕШЕНО РЕШЕНО. Якщо у вас немає даних / годинник I2S, переконайтеся, що реєстр mux виходів налаштований правильно, щоб підключити вихідні штифти до периферійних пристроїв I2S !!!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.