Estou usando o Buildroot para criar um sistema Linux (2.6.39.2) incorporado para o microcontrolador NXP LPC3250.
No momento, estou tentando colocar o ALSA / ASoC em funcionamento, mas estou tendo alguns problemas para conseguir que os módulos funcionem juntos. (Eu acho que!)
Alguns antecedentes importantes:
A placa com a qual estou testando é a placa de desenvolvimento Embedded Artists 3250 V2 . V2 é diferente de V1 por não ter uma tela LCD, mas inclui um codec de áudio I2S: O NXP UDA1380. O suporte da placa para EA3250 V1 está incluído na versão LPCLinux do kernel. Há também uma placa de desenvolvimento diferente, chamada Phytec 3250 , que contém o mesmo chip de codec UDA1380. A distribuição LPCLinux também tem suporte para a placa Phytec, junto com o chip do codec de áudio. Pelo que percebi, a placa Phytec 3250 possui o codec UDA1380 no endereço I2C 0x18 . Na minha placa EA3250 V2, o codec de áudio está localizado no endereço I2C 0x1a .(Verifiquei que o chip está ligado e posso me comunicar usando o pacote I2C-tools. Ele responde ao i2cdetect e posso ler os registros do chip corretamente usando o i2cget.)
Modificando a fonte:
Eu precisava editar os arquivos do driver Phytec 3250 para alterar o endereço do chip do codec. Editei esta seção do 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,
},
};
Depois de fazer essa alteração, fui em frente e construí o sistema novamente e tudo foi compilado. Após inicializar no sistema, tenho os seguintes módulos (além dos módulos principais padrão) em /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
Agora, como eu realmente uno todas essas coisas?
Apenas inserir os módulos com modprobe
não dá realmente o dispositivo ao ALSA / ASoC. Não consigo detectar a placa de som. Isso significa que agora devo criar um novo dispositivo chamado uda1380-codec
no endereço 0x1a e vinculá-lo a um driver? Eu tentei fazer o seguinte:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
e recebi:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Em seguida, tento vincular um driver ao dispositivo:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
e recebi:
sh: write error: No such device
Recebo esse erro para tudo o que tento! Sinto que não estou criando o dispositivo corretamente e não sei como vinculá-lo ao driver correto.
Nota Bene:
Eu estava brincando com isso ontem à noite e, de alguma forma, consegui fazer o ASoC acordar e pelo menos procurar o cartão. Eu estava brincando com ligações diferentes, eu acho. Era tarde e difícil lembrar meus passos, mas consegui pelo menos obter o seguinte erro de alguma forma:
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
Não foi possível recriar este erro!
Editar:
Confirmei que meu código modificado está sendo compilado; portanto, o driver deve estar falando com o endereço correto agora. Depois de carregar manualmente os módulos, a saída de 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
Isso parece certo?
E a minha tabela de dispositivos:
# 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 - - -
fonte
alsa-devel
lista (onde será informado que o 2.6.39 está terrivelmente desatualizado e que o fornecedor do conselho é responsável pelo suporte).alsa-devel
e ninguém respondeu. (Isso eu sei - detesto listas de e-mails, são as piores para ler.) Agora minha caixa de correio está cheia de porcaria da ALSA e ainda não tenho ajuda. Aqui vou eu de novo, sozinho ...Respostas:
Precisa editar o arquivo do quadro que define os dispositivos da plataforma. Eu precisava modificar
arch/arm/mach-lpc32xx/ea3250.c
:Adicione isso:
Edite isso para incluir o codec:
Agora eu tenho todos os dispositivos:
Ainda não consigo
aplay
detectar nada, mas talvez esse seja um problema diferente.EDIT: Sim, esse foi um problema diferente. O número na frente dos dispositivos mostrados por
cat devices
deve corresponder ao número menor do dispositivo nas entradas do seu dispositivo / dev / snd. Tudo parece bom no final da ALSA agora, mas não tenho dados I2S provenientes do LPC3250 ...EDIT2: RESOLVIDO RESOLVIDO RESOLVIDO. Se você não possui dados / relógio I2S, verifique se o registro mux de saída está configurado corretamente para conectar os pinos de saída ao periférico I2S !!!
fonte