link もっと前
   2019年 6月 27日 -
      2019年 6月 18日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

linux-next で音が鳴らなくなっていた

ある時から linux-next で Rock64 の PCM デバイスが全部消えて、一切音が鳴らなくなっていました。RockPro64 も同じようです。

結論だけ先に言うと、この問題は既に ALSA ML で指摘されていて、下記のコミットをリバートすると直ります。

問題のコミット
commit b9f2e25c599bbbf0646957e07ebb72b942c286cc
Author: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date:   Thu Jun 20 09:49:33 2019 +0900

    ASoC: soc-core: use soc_find_component() at snd_soc_find_dai()

    snd_soc_find_dai() finds component first via specified
    snd_soc_dai_link_component, and find DAI from it.

    We already have soc_find_component() to find component,
    but soc_find_dai() has original implementation to find component.

    We shouldn't have duplicate implementation to do same things.
    This patch uses soc_find_component() at soc_find_dai()

    Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>

これは散々調べた後で知りました。悲しい。せっかくなので調べたこともメモしておきます。

ASoC とコンポーネントの登録

最近、ALSA SoC Layer(以下、ASoC)は、ルネサスの森本さんという方の尽力により、実装がかなり変わっているのですが、その一部がバグっていたようです。

ASoC は大まかにいうと、登録と組み合わせの 2段階に分かれています。

ドライバの probe 時に、2つの component を登録します。正式な呼び名がわからないので、ここではとりあえず PCM と DMAC の component と呼びます。

PCM component は DAI(Digital Audio Interface)を持っています。DAI は PCM データの入出力インタフェースのことらしいです。他にも CODEC と呼ばれる、PCM データ(デジタル音声)←→ アナログ音声に変換するドライバも component として扱われています。

サウンドカードのドライバは、複数の component を組み合わせて、PCM の入出力やアナログ音声出力などを実現する仕組みです。

もう少しコード寄りに説明すると PCM component は devm_snd_soc_register_component() を使い、DMAC component は devm_snd_dmaengine_pcm_register() を使って登録します。

これらの関数を呼び出すと、

PCM 用の component 登録時

devm_snd_soc_register_component()
  snd_soc_register_component()
    snd_soc_add_component()
      snd_soc_register_dais()
        soc_add_dai()          ★DAI を component に登録★
      snd_soc_component_add()
        list_add(&component->list, &component_list); ★component をリストに登録★
DMAC 用の component 登録時

devm_snd_dmaengine_pcm_register()
  snd_dmaengine_pcm_register()
    snd_soc_add_component()
      snd_soc_component_add()
        list_add(&component->list, &component_list); ★component をリストに登録★

このような経路を辿ります。

一方、component を組み合わせる際は、

component を組み合わせてサウンドカードを登録

devm_snd_soc_register_card()
  snd_soc_register_card()
    snd_soc_bind_card()
      snd_soc_instantiate_card()
        soc_bind_dai_link()
          snd_soc_find_dai()
            soc_find_component() ★最近変更された部分、適切な component を探す、しかし…★

このように処理されます。

問題の箇所

前置きがかなり長くなりましたが、上記の処理のうち snd_soc_find_dai() の変更にバグがあるようです。元々は関数内に component を探す処理が記述されていましたが、処理は削除され soc_find_component() で適切なコンポーネントを探してくる、という実装に変わりました。

先ほど説明した通り、大抵の ASoC ドライバは PCM 用の component を devm_snd_soc_register_component() で、DMAC 用のコンポーネントを devm_snd_dmaengine_pcm_register() で登録しますが、かなり残念なことに双方とも全く同じ名前で登録されてしまいます。

例えば RockPro64 で /sys/kernel/debug/asoc/components を見ると、

ASoC 登録済み component 一覧を見る方法
root@rockpro64:/# cat /sys/kernel/debug/asoc/components
hdmi-audio-codec.3.auto
ff870000.spdif
ff870000.spdif
ff8a0000.i2s
ff8a0000.i2s
ff890000.i2s
ff890000.i2s
ff880000.i2s
ff880000.i2s
spdif-dit
snd-soc-dummy

このように、同じ名前の component が 2つ登録されていることがわかります。今回のバグの件をさておいても、名前が重複しているのはイマイチですよね……。

組み合わせる際は devm_snd_soc_register_component() で登録した方、つまり PCM 用の component(こいつが DAI を持っている)を探してこなければ、PCM デバイスは正常に登録されません。

しかし soc_find_component() は動きがおかしくて、devm_snd_dmaengine_pcm_register() で登録した方のコンポーネントを返してしまいます。

結果、DAI が見つけることができず、エラーになってしまい、1つもサウンドカードが登録されないままドライバの登録処理が終わります。

もう少し早く知りたかった

この問題を散々調べた後で、既に ALSA ML にて指摘されていたことを知りました。

ALSA ML を最初に調べれば、こんなにコード解析しなくても良かったなあ、と思う一方で、そもそもどういうバグかわからないと、メールは探せないので、鶏と卵ですね。

それと、今に始まったことではありませんが、ASoC は似たような名前の関数が多くて混乱します。先ほど説明にも出ましたが、snd_soc_add_component() と snd_soc_component_add() なんて、一見で違いがわかりません。何でこんな変な名前にしたんだろう……。

メモ: 技術系の話は Facebook から転記しておくことにした。大幅に追記。

[編集者: すずき]
[更新: 2019年 6月 28日 02:01]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

ノート PC の充電器(代打)

以前、出張先にノート PC のアダプタ(USB-PD)を忘れて帰ってきてしまったことがあります。

我が家のノート PC の電源端子は USB Type-C なので、試しにスマホ用の充電器を繋いでみたのですが、うんともすんとも言いませんでした。ノート PC など USB-PD で充電する機器は、充電器側も USB-PD に対応していないと充電が開始されないみたいです。

次のミスに備えて、普段使いの充電器+ノート PC アダプタの代打、が可能な AUKEY の USB-PD 充電器 PA-Y12AUKEY PA-Y12 のサイト)を買いました。Amazon で 5,000円くらいです。

大きさは手のひらサイズくらいですね。端子は Type-C + Type-A x 2 の 3ポートで、出力は合計 72W(Type-C: USB-PD 20V 3A, Type-A: 5V 2.4A)ですから、大抵の USB-PD 機器には対応できるはずです。

普段はスマホ(USB type-C)と Kindle の充電にしか使っていないので、若干勿体ない感が否めないですが、備えあれば憂いなし。

購入は先月(5/25)で、使用して 1か月ほど経っていますが、特に異音や異常もなく元気に動いくれています。良い感じです。

メモ: 技術系の話は Facebook から転記しておくことにした。多少追記。

[編集者: すずき]
[更新: 2019年 6月 26日 01:11]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2019年 6月 27日 -
      2019年 6月 18日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 9/20 00:01

カレンダー

<2019>
<<<06>>>
------1
2345678
9101112131415
16171819202122
23242526272829
30------

最近のコメント 5件

  • link 19年09月01日
    すずき 「私も正直びっくりです。間違って違う製品を...」
    (更新:09/04 23:39)
  • link 19年09月01日
    hdk 「車向けの製品の中でも、車載コンピューター...」
    (更新:09/02 23:20)
  • link 19年07月18日
    hdk 「あっ、AAMはマニュアルのオペレーション...」
    (更新:07/25 00:02)
  • link 19年07月18日
    すずき 「AAM(ASCII Adjust AX ...」
    (更新:07/24 22:22)
  • link 19年07月18日
    hdk 「加算減算は符号のありなしどちらも命令が同...」
    (更新:07/24 07:25)

最近の記事 3件

link もっとみる
  • link 19年09月18日
    すずき 「[linux-next が久しぶりに更新された] ここしばらく更新...」
    (更新:09/20 00:01)
  • link 19年09月17日
    すずき 「[今まで知らなかった make の挙動] シェルから make に...」
    (更新:09/19 02:27)
  • link 19年09月07日
    すずき 「[Sin 波の美しさ勝負] 最近 linux-next で Roc...」
    (更新:09/08 13:17)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報