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 modprobe
ne 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 lsmod
est:
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 - - -
la source
alsa-devel
liste (où l'on vous dira que 2.6.39 est horriblement obsolète et que le fournisseur de la carte est responsable du support).alsa-devel
et 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 ...Réponses:
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:
Modifiez ceci pour inclure le codec:
Maintenant, j'ai tous les appareils:
Je ne peux pas
aplay
encore 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 devices
doit 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 !!!
la source