私はBuildrootを使用してNXP LPC3250マイクロコントローラ用の組み込みLinux(2.6.39.2)システムを構築しています。
私は現在ALSA / ASoCを起動して実行しようとしていますが、モジュールが連携して動作するのにいくつかの問題があります。 (私の考えでは!)
いくつかの重要な背景:
私がテストしているマザーボードはEmbedded Artists 3250 V2開発ボード。 V2はLCD画面がないという点でV1とは異なりますが、含むI2Sオーディオコーデック:NXP UDA1380。 EA3250のマザーボードサポートV1含まれるLPCLinuxカーネルバージョン。という他の開発ボードもあります。パイテック3250、同じUDA1380コーデックチップが含まれています。 LPCLinuxディストリビューションは、Phytecボードとオーディオコーデックチップもサポートしています。私が知っている限り、Phytec 3250ボードのI2CアドレスにはUDA1380コーデックがあります。0x18。私の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
試みたすべてがこのエラーを受け取りました!デバイスを正しく作成していないと感じ、正しいドライバにバインドする方法がわかりません。
ノータベニー:
昨夜、これで遊んで、どういうわけか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 - - -
答え1
プラットフォームデバイスを定義するボードファイルを編集する必要があります。修正すべき事項arch/arm/mach-lpc32xx/ea3250.c
:
これを追加してみてください:
/*
* 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,
};
コーデックを含めるように編集します。
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
今、すべてのデバイスがあります。
# 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
aplay
まだ何も見つかっていませんが、おそらくこれは別の問題です。
編集:はい、これは別の質問です。表示される装置の前の番号は、cat devices
/ dev / snd装置項目のマイナー番号と一致する必要があります。今ALSA側ではすべてが大丈夫に見えますが、LPC3250のI2Sデータはありません...
編集2:解決済み解決済み。 I2Sデータ/クロックがない場合は、出力ピンをI2S周辺機器に接続するように出力マルチプレクサレジスタを正しく設定してください。