ALSA / ASoC: Bagaimana cara memuat perangkat / driver dengan benar?

10

Saya menggunakan Buildroot untuk membangun sistem Linux tertanam (2.6.39.2) untuk mikrokontroler NXP LPC3250.

Saat ini, saya sedang mencoba untuk menjalankan dan menjalankan ALSA / ASoC, tapi saya mengalami beberapa masalah dengan membuat modul untuk bekerja bersama. (Kupikir!)

Beberapa latar belakang penting:

Papan yang saya uji adalah papan pengembangan Embedded Artists 3250 V2 . V2 berbeda dari V1 karena tidak memiliki layar LCD, tetapi menyertakan codec audio I2S: The NXP UDA1380. Dukungan board untuk EA3250 V1 termasuk dalam versi LPCLinux dari kernel. Ada juga papan pengembangan yang berbeda, yang disebut Phytec 3250 , yang berisi chip codec UDA1380 yang sama. Distribusi LPCLinux juga memiliki dukungan untuk papan Phytec, bersama dengan chip codec audio. Dari apa yang saya lihat, board Phytec 3250 memiliki codec UDA1380 pada alamat I2C 0x18 . Di papan EA3250 V2 saya, codec audio terletak di alamat I2C 0x1a .(Saya telah memverifikasi bahwa chip dinyalakan, dan saya dapat berkomunikasi dengannya dengan menggunakan paket I2C-tools. Ia merespon i2cdetect dan saya dapat membaca register dari chip dengan benar menggunakan i2cget.)

Memodifikasi sumber:

Saya perlu mengedit file driver Phytec 3250 untuk mengubah alamat chip codec. Saya mengedit bagian lpc3xxx-uda1380.c ini :

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

Setelah saya melakukan perubahan ini, saya melanjutkan dan membangun sistem lagi dan semuanya terkompilasi dengan baik. Setelah boot ke sistem, saya memiliki modul berikut (selain modul inti standar) di /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

Sekarang, bagaimana saya benar-benar mengikat semua ini bersama?

Hanya memasukkan modul dengan modprobetidak benar-benar memberikan perangkat ke ALSA / ASoC. Saya tidak dapat mendeteksi kartu suara. Apakah ini berarti saya sekarang harus membuat perangkat baru bernama uda1380-codecaddress 0x1a dan mengikatnya ke driver? Saya telah mencoba melakukan hal berikut:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
dan menerima:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Kemudian saya mencoba mengikat driver ke perangkat:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
dan menerima:
sh: write error: No such device

Saya mendapatkan kesalahan ini untuk semua yang saya coba! Saya merasa saya tidak membuat perangkat dengan benar, dan kemudian saya tidak yakin bagaimana cara mengikatnya ke driver yang benar.

Nota bene:

Saya bermain dengan ini tadi malam dan entah bagaimana bisa membuat ASoC bangun dan setidaknya memeriksa kartunya. Saya bermain dengan binding yang berbeda, saya kira. Terlambat dan sulit untuk mengingat langkah saya, tetapi saya setidaknya bisa mendapatkan kesalahan berikut:

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

Saya tidak dapat membuat ulang kesalahan ini!

Edit:

Saya telah mengkonfirmasi kode saya yang dimodifikasi sedang dikompilasi, jadi pengemudi harus berbicara dengan alamat yang benar sekarang. Setelah memuat modul secara manual, output dari lsmodadalah:

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

Apakah ini terlihat benar?

Dan tabel perangkat saya:

# 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      -       -       -
dext0rb
sumber
Anda harus membaca dokumentasi ASoC, dan kemudian bertanya pada alsa-develdaftar (di mana Anda akan diberitahu bahwa 2.6.39 sudah usang, dan vendor papan bertanggung jawab atas dukungan).
CL.
@CL. Terima kasih, vendor papan tidak mendukung codec UDA1380 dengan LPCLinux (saya sudah menghubungi mereka) , itulah sebabnya saya mencoba meretasnya sendiri.
dext0rb
Saya memposting ke alsa-develdan tidak ada yang merespons. (Yang bisa saya katakan - Saya benci mail-list, mereka adalah yang terburuk untuk dibaca.) Sekarang kotak surat saya penuh dengan omong kosong ALSA dan saya masih tidak memiliki bantuan. Ini dia lagi, sendiri ...
dext0rb

Jawaban:

3

Perlu mengedit file papan yang mendefinisikan perangkat platform. Saya perlu memodifikasi arch/arm/mach-lpc32xx/ea3250.c:

Tambahkan ini:

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

Edit ini untuk memasukkan codec:

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

Sekarang saya memiliki semua perangkat:

# 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

Saya belum bisa aplaymendeteksi apa pun, tapi mungkin itu masalah yang berbeda.

EDIT: Ya, itu masalah yang berbeda. Nomor di depan perangkat yang ditunjukkan oleh cat devicesharus sesuai dengan nomor perangkat Minor di entri perangkat / dev / snd Anda. Segalanya tampak bagus di akhir ALSA sekarang, tapi saya tidak punya data I2S yang berasal dari LPC3250 ...

EDIT2: ASK ASK ASK. Jika Anda tidak memiliki data / jam I2S, pastikan register mux output dikonfigurasikan dengan benar untuk menghubungkan pin output ke perangkat I2S !!!

dext0rb
sumber