ALSA / ASoC: Comment charger correctement les périphériques / pilotes?

10

J'utilise Buildroot pour construire un système Linux embarqué (2.6.39.2) pour le microcontrôleur NXP LPC3250.

En ce moment, j'essaie de faire fonctionner ALSA / ASoC, mais j'ai des problèmes pour que les modules fonctionnent ensemble. (Je pense!)

Quelques informations importantes:

La carte avec laquelle je teste est la carte de développement Embedded Artists 3250 V2 . V2 est différent de V1 en ce qu'il n'a pas d'écran LCD, mais inclut un codec audio I2S: le NXP UDA1380. Le support de carte pour EA3250 V1 est inclus dans la version LPCLinux du noyau. Il existe également une carte de développement différente, appelée Phytec 3250 , qui contient la même puce de codec UDA1380. La distribution LPCLinux prend également en charge la carte Phytec, ainsi que la puce de codec audio. D'après ce que j'ai discerné, la carte Phytec 3250 a le codec UDA1380 sur l'adresse I2C 0x18 . Sur ma carte EA3250 V2, le codec audio est situé à l'adresse I2C 0x1a .(J'ai vérifié que la puce est sous tension et je peux communiquer avec elle en utilisant le package I2C-tools. Elle répond à i2cdetect et je peux lire correctement les registres de la puce à l'aide d'i2cget.)

Modification de la source:

J'avais besoin de modifier les fichiers du pilote Phytec 3250 pour changer l'adresse de la puce du codec. J'ai édité cette section de 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,
          },
  };

Après avoir fait ce changement, j'ai continué et j'ai reconstruit le système et tout s'est bien passé. Après avoir démarré dans le système, j'ai les modules suivants (en plus des modules de base standard) dans /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

Maintenant, comment puis-je réellement lier toutes ces choses ensemble?

L'insertion des modules avec modprobene donne pas réellement le périphérique à ALSA / ASoC. Je ne parviens pas à détecter la carte son. Est-ce à dire que je dois maintenant créer un nouveau périphérique appelé uda1380-codecà l'adresse 0x1a et le lier à un pilote? J'ai essayé de faire ce qui suit:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
et reçu:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Ensuite, j'essaie de lier un pilote à l'appareil:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
et reçu:
sh: write error: No such device

je reçois cette erreur pour tout ce que j'essaie! J'ai l'impression de ne pas créer correctement le périphérique, puis je ne sais pas comment le lier au bon pilote.

Nota bene:

Je jouais avec ça hier soir et j'ai réussi à faire en sorte que l'ASoC se réveille et au moins cherche la carte. Je jouais avec différentes fixations, je suppose. Il était tard et difficile de se souvenir de mes étapes, mais j'ai pu au moins obtenir l'erreur suivante:

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

Je n'ai pas pu recréer cette erreur!

Éditer:

J'ai confirmé que mon code modifié était en cours de compilation, donc le pilote devrait parler à la bonne adresse maintenant. Après avoir chargé manuellement les modules, la sortie de lsmodest:

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

Cela semble-t-il correct?

Et ma table d'appareil:

# 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
la source
Vous devriez lire la documentation ASoC, puis demander sur la alsa-develliste (où l'on vous dira que 2.6.39 est horriblement obsolète et que le fournisseur de la carte est responsable du support).
CL.
@CL. Merci, le fournisseur de cartes ne prend pas en charge le codec UDA1380 avec LPCLinux (je les ai déjà contactés) , c'est pourquoi j'essaie de le pirater en moi-même.
dext0rb
J'ai posté alsa-develet personne n'a répondu. (Ce que je peux dire - je déteste les listes de diffusion, ce sont les pires à lire.) Maintenant, ma boîte aux lettres est pleine de conneries d'ALSA et je n'ai toujours aucune aide. Je recommence, tout seul ...
dext0rb

Réponses:

3

Besoin de modifier le fichier de la carte qui définit les périphériques de la plate-forme. Je devais modifier arch/arm/mach-lpc32xx/ea3250.c:

Ajoute ça:

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

Modifiez ceci pour inclure le 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

Maintenant, j'ai tous les appareils:

# 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

Je ne peux pas aplayencore détecter quoi que ce soit, mais c'est peut-être un problème différent.

EDIT: Oui, c'était une question différente. Le numéro devant les périphériques indiqué par cat devicesdoit correspondre au numéro de périphérique mineur dans vos entrées de périphérique / dev / snd. Tout semble bien sur ALSA fin maintenant, mais je n'ai pas de données I2S provenant du LPC3250 ...

EDIT2: RESOLU RESOLU RESOLU. S'il n'y a pas de données / d'horloge I2S, assurez-vous que le registre du multiplexeur de sortie est correctement configuré pour connecter les broches de sortie au périphérique I2S !!!

dext0rb
la source