目次: ROCK64/ROCKPro64
ある時から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>
これは散々調べた後で知りました。悲しい。せっかくなので調べたこともメモしておきます。
最近、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() を使って登録します。
これらの関数を呼び出すと、
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をリストに登録★
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を組み合わせる際は、
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を見ると、
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から転記しておくことにした。大幅に追記。
以前、出張先にノートPCのアダプタ(USB-PD)を忘れて帰ってきてしまったことがあります。
我が家のノートPCの電源端子はUSB Type-Cなので、試しにスマホ用の充電器を繋いでみたのですが、うんともすんとも言いませんでした。ノートPCなどUSB-PDで充電する機器は、充電器側もUSB-PDに対応していないと充電が開始されないみたいです。
次のミスに備えて、普段使いの充電器+ノートPCアダプタの代打、が可能なAUKEYのUSB-PD充電器PA-Y12(AUKEY 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 | > | ||||
<< | < | 07 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.18.
using GD 2.3.3(png support.)