目次: ROCK64/ROCKPro64
先日(2018年7月22日の日記参照)買ったRockchip RK3328搭載ボードROCK64で遊んでいます。
RockchipのSoCで動くLinuxはRockchipがメンテナンスしているLinux(以降Rockchip Linux)ですが、実はLinuxの本流開発ツリー(以降linux-next)も動作します。
しかしlinux-nextの方は全く音が出ません(speaker-testで叩くとxrun_recovery faild: -5, Input/output errorが出ます)。
以前S/PDIFも全く動かなかったのですが、原因が分かったのでパッチを送って直しました。今は出音までできているはずです。しかしI2Sは原因が違うらしく、なぜ動かないのかさっぱりです。
I2Sのレジスタ情報はTRM(Technical Reference Manual)に載っていたので、それを見つつRockchip Linuxとレジスタ値を同じに揃えましたが、I2Sは微塵も動きませんでした……。
I2S以外のドライバのバグを疑い、Rockchip LinuxのI2Sドライバを丸ごとコピーしたら、動いてしまいました。疑いはハズレ、つまりI2Sドライバに何らかのバグがあることは確定です。一体何が違うんでしょう。diffを見ましたが差分の意味がわかりません。
差分は多くないので、力技でRockchip Linuxからlinux-nextに1つずつ差分を移植していって、動作するかどうか確かめました。原因はdevm_snd_dmaengine_pcm_register() の第2引数(config)にNULLを渡すかどうか、でした。
私には、その違いの意味するところも、現在のlinux-nextのコードの何が悪いのかも、さっぱりわかりません。
動作とコードを追ってみると、現在のlinux-nextのコードはstruct snd_dmaengine_pcm_configのprepare_slave_configを設定し忘れているため、全くDMA転送設定がされていないことがわかりました。
要は、音声データを全くI2Sハードに送っていなかったんです。そりゃ動くわけないわ。
Rockchip Linuxはどうしていたかというとdevm_snd_dmaengine_pcm_register() の第2引数にNULLを指定していました。何も指定していないのに、どうして動くのでしょう?同じバグを踏まないのでしょうか?
実は第二引数にNULLを指定するとALSAのフレームワーク側でprepare_slave_configにsnd_dmaengine_pcm_prepare_slave_config() を指定した状態と同等に扱われます。この働きにより、無事動作していたのでした。わかるかそんなの。
知っていれば秒殺系のバグでしょうけど、私はぱっと見ではわかりませんでした。
バグの修正としてはたった1行なんですが、理解するまで2日掛かりました。Linux詳しい人はもっと早く解析できると思います……。Linuxを触っているとこういうの多いので、もっとLinuxパワーが欲しいです。
せっかく判明したバグなのでALSA MLにパッチをぶん投げておきました。
ちなみに、これで万事解決ではなく、アナログ音声端子から音を出すにはI2S1とACODECというハードを叩かないといけないです(今回動いたのはI2S0)。今わかっているだけで、
これだけの問題があります。Rockchip Linuxは何らかの方法で問題を解決しているはずなのですが、今のところ私にはさっぱりわかりません。
私のような門外漢が四苦八苦するより、Rockchipの中の人がlinux-nextに修正パッチを投げてくれる方が断然早いんですけどねえ。あまりlinux-nextにはご興味がないのでしょうか。
< | 2018 | > | ||||
<< | < | 11 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 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 | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)