Armadilloフォーラム

wm8978の初期化失敗について

tanaka

2019年7月2日 13時30分

お世話になります。

オーディオCODECのwm8978を搭載した自作基板と、Armadilloを接続しています。

Armadillo起動時、稀に以下のようなメッセージが出て、
wm8978の初期化(?)に失敗するときがあります。

wm8978 0-001a: Failed to issue reset: -5
wm8978: probe of 0-001a failed with error -5

何か原因が分かりませんでしょうか。

コメント

溝渕です。

> Armadillo起動時、稀に以下のようなメッセージが出て、
> wm8978の初期化(?)に失敗するときがあります。
>
> wm8978 0-001a: Failed to issue reset: -5
> wm8978: probe of 0-001a failed with error -5

上記メッセージは、以下の場所で出力しています。

sound/soc/codecs/wm8978.c:
static __devinit int wm8978_i2c_probe(struct i2c_client *i2c,
                      const struct i2c_device_id *id)
{
  :(snip)
    /* Reset the codec */
    ret = regmap_write(wm8978->regmap, WM8978_RESET, 0);
    if (ret != 0) {
        dev_err(&i2c->dev, "Failed to issue reset: %d\n", ret);
        goto err;
    }

多分、i2cアクセスが正常に実行できていないのではないかと思います。波形
はきれいに出ていますか?

溝渕様

お世話になります。
I2Cの波形を確認しましたので、添付します。

添付の2項にI2Cの立上り波形を記載していますが、実測では約300nsです。
これはwm8978のデータシートに記載あるMAX値とほぼ同じなので、
ちょっと気になります。

アルマジロから出力されるI2Cのクロックの立上りは、約300nsであるという認識でよいでしょうか。
(接続される負荷にもよると思いますが)

ファイル ファイルの説明
I2C波形確認a.pdf

溝渕です。

> 添付の2項にI2Cの立上り波形を記載していますが、実測では約300nsです。
> これはwm8978のデータシートに記載あるMAX値とほぼ同じなので、
> ちょっと気になります。

同感です。

> アルマジロから出力されるI2Cのクロックの立上りは、約300nsであるという認識でよいでしょうか。

まず、アルマジロからhighを出力していますか?ソフトウェアはどのように実装していますか?

通常、基板上(又はSoC内部)のpull upによってhighにする場合が多いかと思い
ます。自作された基板の回路を確認してみてください。

溝渕様

お世話になります。

> まず、アルマジロからhighを出力していますか?ソフトウェアはどのように実装していますか?
→アルマジロのI2Cラインにはwm8978のみ接続されています。回路は、貴社の液晶モデルの回路を流用しています。
 アルマジロとwm8978のI2CのSCLKのパターンを切断し、アルマジロから出力される波形を見ました。
 同じタイミングで前回送ったような波形が観測されました。ただし、立上り時間は約260nsになりました。
 多分無負荷になったので、立上りが早くなったものと推測します。

 ソフトウェア実装については実装云々よりも、今回は、linuxの起動時のデバイス認識時の問題です。
 正常時と異常時(認識失敗時)のシスログを以下に記載します。

(正常時)
Jul 9 13:45:11 (none) user.info kernel: #1: FSI2A-WM8978
Jul 9 13:45:11 (none) user.info kernel: #0: FSI2B-HDMI
Jul 9 13:45:11 (none) user.info kernel: ALSA device list:

(異常時)
Jul 9 13:44:44 (none) user.info kernel: #0: FSI2B-HDMI
Jul 9 13:44:44 (none) user.info kernel: ALSA device list:

> 通常、基板上(又はSoC内部)のpull upによってhighにする場合が多いかと思い
> ます。自作された基板の回路を確認してみてください。
→ このご指摘はつまり、アルマジロ外部でクロックラインにプルアップを付けなさいという意味でしょうか。
 アルマジロには3kΩのプルアップがあるようなので、それでよいのかと思っていましたが、
 これ以外にも必要に応じてプルアップを付ける必要があるという認識でよいでしょうか。

溝渕です。

> > 通常、基板上(又はSoC内部)のpull upによってhighにする場合が多いかと思い
> > ます。自作された基板の回路を確認してみてください。
> → このご指摘はつまり、アルマジロ外部でクロックラインにプルアップを付けなさいという意味でしょうか。

ハードウェア/ソフトウェア構成に応じて必要です。

SCL/SDAに関わらず、I2Cではhighでドライブすること少ないと思います。例えばgpio-i2cの場合は、

highにする場合: gpioをinputに設定する(外部 or 内部プルアップによりhighになる)
lowにする場合 : gpioをoutput-lowに設定する

のようになります。

>  アルマジロには3kΩのプルアップがあるようなので、それでよいのかと思っていましたが、

どのピンを利用しているのでしょうか。利用しているピンのPAD設定でプルダ
ウンを付けたりしていませんか。

>  これ以外にも必要に応じてプルアップを付ける必要があるという認識でよいでしょうか。

必要に応じて付ける必要があります。