ALSA / ASoC: Wie lade ich Geräte / Treiber richtig?

10

Ich verwende Buildroot, um ein eingebettetes Linux-System (2.6.39.2) für den NXP LPC3250-Mikrocontroller zu erstellen.

Im Moment versuche ich, ALSA / ASoC zum Laufen zu bringen, aber ich habe einige Probleme damit, dass die Module zusammenarbeiten. (Meiner Ansicht nach!)

Einige wichtige Hintergründe:

Das Board, mit dem ich teste, ist das Embedded Artists 3250 V2-Entwicklungsboard . V2 unterscheidet sich von V1, dass sie nicht über einen LCD - Bildschirm verfügt, sondern enthält einen I2S - Audiocodec: Der NXP UDA1380. Die Board-Unterstützung für EA3250 V1 ist in der LPCLinux- Version des Kernels enthalten. Es gibt auch ein anderes Entwicklungsboard namens Phytec 3250 , das denselben UDA1380-Codec-Chip enthält. Die LPCLinux-Distribution unterstützt neben dem Audio-Codec-Chip auch die Phytec-Karte. Soweit ich festgestellt habe, verfügt die Phytec 3250-Karte über den UDA1380-Codec an der I2C-Adresse 0x18 . Auf meiner EA3250 V2-Karte befindet sich der Audio-Codec unter der I2C-Adresse 0x1a .(Ich habe überprüft, ob der Chip eingeschaltet ist, und kann über das I2C-Tools-Paket mit ihm kommunizieren. Er reagiert auf i2cdetect und kann mit i2cget die Register korrekt vom Chip lesen.)

Ändern der Quelle:

Ich musste die Phytec 3250-Treiberdateien bearbeiten, um die Adresse des Codec-Chips zu ändern. Ich habe diesen Abschnitt von lpc3xxx-uda1380.c bearbeitet :

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

Nachdem ich diese Änderung vorgenommen hatte, baute ich das System erneut auf und alles wurde in Ordnung kompiliert. Nach dem Booten in das System habe ich die folgenden Module (zusätzlich zu den Standard-Kernmodulen) in /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

Wie binde ich das ganze Zeug zusammen?

Das Einfügen der Module mit modprobegibt das Gerät nicht an ALSA / ASoC weiter. Ich kann die Soundkarte nicht erkennen. Bedeutet dies, dass ich jetzt ein neues Gerät uda1380-codecmit der Adresse 0x1a erstellen und es an einen Treiber binden muss? Ich habe Folgendes versucht:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
und erhalten:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Dann versuche ich, einen Treiber an das Gerät zu binden:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
und erhalten:
sh: write error: No such device

Ich erhalte diesen Fehler für alles, was ich versuche! Ich habe das Gefühl, dass ich das Gerät nicht richtig erstelle, und bin mir dann nicht sicher, wie ich es an den richtigen Treiber binden soll.

Nota Bene:

Ich habe letzte Nacht damit gespielt und war irgendwie in der Lage, ASoC zum Aufwachen zu bringen und zumindest nach der Karte zu suchen. Ich habe mit verschiedenen Bindungen gespielt, denke ich. Es war spät und schwer, sich an meine Schritte zu erinnern, aber ich konnte zumindest irgendwie den folgenden Fehler bekommen:

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

Ich konnte diesen Fehler nicht wiederherstellen!

Bearbeiten:

Ich habe bestätigt, dass mein geänderter Code kompiliert wird, daher sollte der Treiber jetzt mit der richtigen Adresse sprechen. Nach dem manuellen Laden der Module lsmodlautet die Ausgabe von :

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

Sieht das richtig aus?

Und meine Gerätetabelle:

# 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
quelle
Sie sollten die ASoC-Dokumentation lesen und dann in der alsa-develListe nachfragen (wo Ihnen mitgeteilt wird, dass 2.6.39 schrecklich veraltet ist und der Board-Anbieter für den Support verantwortlich ist).
CL.
@CL. Vielen Dank, der Board-Anbieter unterstützt den UDA1380-Codec mit LPCLinux nicht (ich habe ihn bereits kontaktiert) , weshalb ich versuche, ihn in mich selbst zu hacken.
Dext0rb
Ich habe auf gepostet alsa-develund niemand hat geantwortet. (Das kann ich sagen - ich hasse Mail-Listen, sie sind am schlechtesten zu lesen.) Jetzt ist meine Mailbox voller ALSA-Mist und ich habe immer noch keine Hilfe. Hier gehe ich wieder alleine ...
dext0rb

Antworten:

3

Sie müssen die Datei des Boards bearbeiten, die Plattformgeräte definiert. Ich musste ändern arch/arm/mach-lpc32xx/ea3250.c:

Füge das hinzu:

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

Bearbeiten Sie dies, um den Codec einzuschließen:

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

Jetzt habe ich alle Geräte:

# 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

Ich kann noch aplaynichts erkennen, aber vielleicht ist das ein anderes Problem.

EDIT: Ja, das war ein anderes Thema. Die Nummer vor den von angezeigten Geräten cat devicessollte mit der Minor-Gerätenummer in Ihren / dev / snd-Geräteeinträgen übereinstimmen. Am Ende von ALSA scheint jetzt alles gut zu sein, aber ich habe keine I2S-Daten vom LPC3250 ...

EDIT2: Gelöst Gelöst Gelöst Gelöst. Wenn Sie keine I2S-Daten / Uhr haben, stellen Sie sicher, dass das Ausgangs-Mux-Register richtig konfiguriert ist, um die Ausgangspins mit dem I2S-Peripheriegerät zu verbinden !!!

dext0rb
quelle