ALSA / ASoC:デバイス/ドライバーを正しくロードする方法は?


10

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      -       -       -

ASoCのドキュメントを読んでから、alsa-develリストで質問してください(2.6.39はひどく時代遅れであり、ボードベンダーがサポートを担当していることが通知されます)。
CL。

@CL。おかげで、ボードベンダーはLPCLinuxでUDA1380コーデックをサポートしていません(既に問い合わせました)。そのため、自分でハックしようとしています。
dext0rb

に投稿しましたがalsa-devel、誰も応答しませんでした。(私が知ることができること-私はメールリストが嫌いです、それらは読むのが最悪です。)今私のメールボックスはALSAのがらくたでいっぱいであり、私はまだ助けがありません。ここで私は一人で再び行きます...
dext0rb

回答:


3

プラットフォームデバイスを定義するボードのファイルを編集する必要があります。私は修正する必要がありました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データはありません...

EDIT2:解決済み解決済み解決済み。I2Sデータ/クロックがない場合は、出力マルチプレクサレジスタが出力ピンをI2Sペリフェラルに接続するように正しく構成されていることを確認してください!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.