Buildrootを使用して、NXP LPC3250マイクロコントローラー用の組み込みLinux(2.6.39.2)システムを構築しています。
現在、ALSA / ASoCを起動して実行しようとしていますが、モジュールを一緒に機能させるのにいくつか問題があります。(おもう!)
重要な背景:
私がテストしているボードは、Embedded Artists 3250 V2開発ボードです。V2は、LCD画面がないという点でV1とは異なりますが、I2Sオーディオコーデック(NXP UDA1380)が含まれています。EA3250 V1のボードサポートは、カーネルのLPCLinuxバージョンに含まれています。Phytec 3250と呼ばれる別の開発ボードもあり、同じUDA1380コーデックチップが含まれています。LPCLinuxディストリビューションは、オーディオコーデックチップとともにPhytecボードもサポートしています。私が識別したことから、Phytec 3250ボードのI2Cアドレス0x18にはUDA1380コーデックが搭載されています。私のEA3250 V2ボードでは、オーディオコーデックはI2Cアドレス0x1aにあります。(チップの電源が入っていることを確認しました。I2C-toolsパッケージを使用して通信できます。i2cdetectに応答し、i2cgetを使用してチップからレジスタを正しく読み取ることができます。)
ソースの変更:
Phytec 3250ドライバーファイルを編集して、コーデックチップのアドレスを変更する必要がありました。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,
},
};
この変更を行った後、私は先に進んでシステムを再構築し、すべてが正常にコンパイルされました。システムを起動した後、(標準のコアモジュールに加えて)次のモジュールをに入れました/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
では、これらすべてを実際にどのように結合するのでしょうか。
でモジュールを挿入するだけでmodprobe
は、実際にデバイスをALSA / ASoCに渡すことはできません。サウンドカードを検出できません。これはuda1380-codec
、アドレス0x1aで呼び出される新しいデバイスを作成し、それをドライバーにバインドする必要があることを意味しますか?私は次の
ことを試してみ
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
ました:受け取った:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
次に、デバイスにドライバーをバインドしよう
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
としました:受け取った:
sh: write error: No such device
試行したすべてに対してこのエラーが発生しました!デバイスを正しく作成していないような気がしますが、デバイスを正しいドライバーにバインドする方法がわかりません。
Nota Bene:
私はこれを昨夜遊んでいて、どういうわけかASoCをウェイクアップさせ、少なくともカードを調査させることができました。私は別のバインディングで遊んでいたと思います。遅くて私の手順を思い出すのは困難でしたが、少なくとも次のエラーをなんとかして得ることができました。
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
このエラーを再現できませんでした!
編集:
変更したコードがコンパイルされていることを確認したので、ドライバーは正しいアドレスと通信しているはずです。モジュールを手動でロードした後の出力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
これは正しいですか?
そして私のデバイステーブル:
# 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 - - -
alsa-devel
、誰も応答しませんでした。(私が知ることができること-私はメールリストが嫌いです、それらは読むのが最悪です。)今私のメールボックスはALSAのがらくたでいっぱいであり、私はまだ助けがありません。ここで私は一人で再び行きます...
alsa-devel
リストで質問してください(2.6.39はひどく時代遅れであり、ボードベンダーがサポートを担当していることが通知されます)。