ALSA / ASoC: Aygıtları / sürücüleri doğru şekilde nasıl yükleyebilirim?


10

NXP LPC3250 mikrodenetleyici için yerleşik bir Linux (2.6.39.2) sistemi oluşturmak için Buildroot kullanıyorum.

Şu anda ALSA / ASoC'yi çalıştırmaya çalışıyorum, ancak modüllerin birlikte çalışmasını sağlamakla ilgili bazı sorunlar yaşıyorum. (Bence!)

Bazı önemli bilgiler:

Test ettiğim pano Embedded Artists 3250 V2 geliştirme kartı . V2 bir LCD ekranı yok o V1 farklıdır, fakat içermez bir I2S ses codec'i: NXP UDA1380. EA3250 V1 için kart desteği , çekirdeğin LPCLinux sürümüne dahildir . Aynı UDA1380 kodek çipini içeren Phytec 3250 adlı farklı bir geliştirme kartı da var . LPCLinux dağıtımında ses kodek çipi ile birlikte Phytec kartı desteği de vardır. Ne fark ettiğimden, Phytec 3250 kartı UDA1380 kodek I2C adresi 0x18 vardır . EA3250 V2 kartımda, ses codec bileşeni I2C adresi 0x1a'da bulunur .(Çipin açıldığını doğruladım ve I2C araçları paketini kullanarak iletişim kurabilirim. İ2cdetect'e yanıt verir ve i2cget kullanarak çipteki kayıtları doğru bir şekilde okuyabilirim.)

Kaynağı değiştirme:

Codec yongasının adresini değiştirmek için Phytec 3250 sürücü dosyalarını düzenlemem gerekiyordu. Ben lpc3xxx-uda1380.c bu bölümünü düzenledi :

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,
          },
  };

Bu değişikliği yaptıktan sonra, sistemi tekrar kurdum ve her şey yoluna girdi. Sisteme önyükleme yaptıktan sonra, aşağıdaki modüller (standart çekirdek modüllere ek olarak) var /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

Şimdi, tüm bunları birbirine nasıl bağlarım?

Sadece modülleri takmak, modprobecihazı gerçekten ALSA / ASoC'ye vermez. Ses kartını tespit edemiyorum. Bu, şimdi 0x1auda1380-codec adresinde yeni bir cihaz yapmam ve bir sürücüye bağlamam gerektiği anlamına mı geliyor ? Aşağıdakileri yapmayı denedim:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
ve
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
aldım : Sonra bir sürücüyü aygıta bağlamaya çalışıyorum:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
ve
sh: write error: No such device

aldım: Denediğim her şey için bu hatayı alıyorum! Aygıtı doğru bir şekilde oluşturmadığımı hissediyorum ve sonra doğru sürücüye nasıl bağlayacağımdan emin değilim.

Nota Bene:

Dün gece bununla oynuyordum ve bir şekilde ASoC'u uyandırabildim ve en azından kart için araştırdım. Farklı bağlarla oynuyordum sanırım. Adımlarımı hatırlamak geç ve zor oldu, ama en azından bir şekilde aşağıdaki hatayı alabildim:

uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22

Bu hatayı yeniden oluşturamadım!

Düzenle:

Değiştirilmiş kodumun derlendiğini onayladım, bu yüzden sürücü şimdi doğru adresle konuşuyor olmalı. Modülleri manuel olarak yükledikten sonra çıktısı 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

Bu doğru görünüyor mu?

Cihaz tablom:

# 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 belgelerini okumalı ve sonra alsa-devellistede sormalısınız (burada 2.6.39'un çok eski olduğu ve pano satıcısının destekten sorumlu olduğu söylenecektir).
CL.

@CL. Teşekkürler, tahta satıcısı LPCLinux ile UDA1380 codec'i desteklemiyor (ben zaten onlarla temasa geçtim ) , bu yüzden kendim kesmek için çalışıyorum.
dext0rb

Yayınladım alsa-develve kimse yanıt vermedi. (Söyleyebileceğim - Posta listelerinden nefret ediyorum, okumak en kötüsü.) Şimdi posta kutum ALSA bok dolu ve hala yardımım yok. İşte yine
başlıyorum

Yanıtlar:


3

Platform cihazlarını tanımlayan anakartın dosyasını düzenlemeniz gerekir. Ben değiştirmek gerekiyordu arch/arm/mach-lpc32xx/ea3250.c:

Bunu ekle:

/*
 * 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,
};

Kodek eklemek için bunu düzenleyin:

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

Şimdi tüm cihazlara sahibim:

# 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

aplayHenüz bir şey tespit edemiyorum ama belki de bu farklı bir konudur.

EDIT: Evet, bu farklı bir konuydu. Tarafından gösterilen cihazların önündeki cat devicessayı, / dev / snd cihaz girişlerinizdeki Küçük cihaz numarasıyla eşleşmelidir. Şimdi ALSA'da her şey iyi görünüyor, ancak LPC3250'den gelen I2S verim yok ...

EDIT2: SOLVED SOLVED SOLVED. I2S veri / saati yoksa, çıkış mux kaydının I2S çevre birimine çıkış pimlerini bağlamak için doğru yapılandırıldığından emin olun !!!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.