Raspberry Pi OSがkernel 5.x系に移行 ドライバモジュールのコンパイル方法も変更に
いままでRaspbianと呼んでいた公式のOSの名称がRaspberry Pi OSに変わっていました。
DebianをベースにRaspberryPi用にカスタマイズしていたディストリビューションだからRaspbianという名称だったのですが、完全に独立したくなったのでしょうか。
現在最新の「2020-08-20-raspios-buster」ではカーネルが4.19系から5.4系になりました。
移行に際し様々な問題が起こっているので公式のフォーラムの方にもスレッドが立っています。
https://www.raspberrypi.org/forums/viewtopic.php?t=269769&start=50
これを横目で見つつも、私がハマったところを備忘録として抜粋しておきます。ここではPi3Bを使って進めています。場合によってはPi4やその他のラズパイで現象が異なるかもしれません。ご了承ください。
外部モジュールドライバをコンパイルしたいのに、kernel moduleをコンパイル!?
まず、こちらのスレッドに出ているように外部モジュールを makeすると、なぜかkernelソース側ドライバのコンパイルが始まってしまう現象。
そして、数時間のあと、肝心の外部モジュールの***.koは出来上がっていません。
当該スレッドにて回答している人によると、sudo rpi-source(kernel source 取得ツール) は rpi-updateした後に実行することを推奨しているとのこと。
「2020-05-27-raspios-buster-lite-armhf」なら
sudo rpi-update 87fea11838d706311dc3708d67c334967505a292
カーネル5.4.49の場合なら
sudo rpi-update da3752a358a86014cdcce5fc3be5b18d7ec074c4
と書いてます。 このハッシュタグらしきものはどこから拾ってくるの? と言うと
https://github.com/Hexxeh/rpi-firmware/commits/master から
Kernel: Bump to X.X.XX を探し、右側のボタンから展開してcommit 番号をもってきます。
なるほど。これで任意のバージョンのkernelにrpi-updateできますね。
で、やってみたところ。。。
rpi-update して rpi-sourceして、いざsudo make
ダメでした。
変わらずkernelソースの方のmoduleのコンパイルが始まってしまいます。終わるまで待つと3~4時間くらいかかる。
解決 Makefileの記述方法が変わった
いつ変わったのか知らなかったのですが、Makefileの記述方法が変わっていました。
今までの記述
KERNEL_SRC = /lib/modules/$(shell uname -r)/build
BUILD_DIR := $(shell pwd)
DTC_DIR = /lib/modules/$(shell uname -r)/build/scripts/dtc/
VERBOSE = 0
OBJS = sabre9018q2c.o sabreberry32.o
obj-m := $(OBJS)
all:
make -C $(KERNEL_SRC) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules
clean:
make -C $(KERNEL_SRC) SUBDIRS=$(BUILD_DIR) clean
・・・・・続く
新しい書き方
KERNEL_SRC = /lib/modules/$(shell uname -r)/build
BUILD_DIR := $(shell pwd)
DTC_DIR = /lib/modules/$(shell uname -r)/build/scripts/dtc/
VERBOSE = 0
OBJS = sabre9018q2c.o sabreberry32.o
obj-m := $(OBJS)
all:
make -C $(KERNEL_SRC) M=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules
clean:
make -C $(KERNEL_SRC) M=$(BUILD_DIR) clean
・・・・・続く
この例はsabreberry32ドライバのMakefileの一部です。SUBDIRS=***と書いていた部分を M=***に変更します。それだけです。
外部モジュールソースの場所を指定している部分なのですが、古い記述方法が通らなくなったようです。
いやー、 こんなところでハマるんですね。
それでもvolumioで倍速再生が止まらない
Volumio2.8xxあたりからpi3で再生音が倍速になってしまう現象がでていました。Pi4では問題ありません。
この現象の原因を突き止める必要があります。
まずは、Volumio特有のバグなのかRaspbianの不具合なのか切り分けです。VolumioのOSのベースにしているRasbian(2020-05-27-raspios-buster-lite-armhf)ではどうなっているのか?
結果だけ書くと同じ現象が起きてました。Volumioのバグではありません。
kernelバージョンは4.19.118
本格的にDebugするしかないですね。これは。
ドライバの動作を単純に書くと、再生する曲のサンプリング周波数に合わせて
MCLKから分周するデバイダ設定
発振源のクロック 44.1kHz系/48kHz系の選択
の2つです。
これらは、I2C通信によってDAC側のレジスタを操作しています。
ちゃんとI2C通信がでているのかオシロで見ていきます。
あれれ? 命令がでていないじゃないですか!!!
クロック選択とデバイダ設定の2種類しかないのに、(タイミング?により)どちらか片方しか出ない。
そんなことってあるの?
ドライバのソースコードには書いてあるのに信号が出てこないって、命令がどこかで蒸発してますよ。
同じソースコードでPi4は問題なし。ちょっと古いカーネルならPi2/Pi3でも大丈夫。新しいカーネルのPi2/Pi3のI2C周りに何かありそうです。
まあ、あれこれ2週間くらい暇を見つけてやっていたのですが、結局、根本原因は不明。
曲のサンプリング周波数が変わったときにI2C通信でデータを送っている部分 snd_soc_component_update_bits()関数の後にmdelay(5)を挿入してあげるなど苦肉の策をとったところ、信号がちゃんと出るようになりました。連続して多数snd_soc_component_update_bits()を発行している所は大丈夫なようです。2個くらい連続送信すると、そのうちの1個が蒸発する。
こんな気まぐれ動作、ソースコードを読んでいても解らないですよ。
Pi3用の新しいi2cドライバ部分に何かが潜んでいそうです。
とりあえずは倍速再生が正常に戻って良かったです。VolumioのPi2/Pi3用のドライバも用意できるようになりました。
そして kernel 5.4.x
とりあえず解決できたので、気を良くして最新版のRaspberry Pi OS(2020-08-20-raspios-buster)用にもSabreberry32ドライバのコンパイルを試みたところ、別の問題が発覚・・・
コンパイルするとエラー続出です。 kernelの大幅アップデートでは良くあることです。
set_fs(get_ds()); ---> set_fs(KERNEL_DS);
dai->cpu_dai_name = NULL; dai->cpus->dai_name = NULL;
dai->cpu_of_node = i2s_node; dai->cpus->of_node = i2s_node;
dai->platform_name = NULL; dai->platforms->name = NULL;
dai->platform_of_node = i2s_node; dai->platforms->of_node = i2s_node;
その他にもあったような気がしますが、機械的に置き換えてしまいます。コンパイル時にエラーメッセージがでるので、ネット検索すると大抵、先人がやってて情報が見つかります。まったく見つからないときは、ラズパイ公式のフォーラムか、Stack Overflowあたりに投稿すれば誰かが導いてくれると思います。
という訳で、最新のRaspberry Pi OS(kernel 5.4.51-v7+)でも、外部ドライバをコンパイルすることが出来るようになりました。音の方も無事に出ています。Volumio2が次にバージョンアップしてkernel 5.4.xxになっても大丈夫。
ドライバのdebug情報の出し方
dev_dbg()関数を仕込むことで開発中のドライバのdebug情報を出せるらしいのですが、調べてみると下準備が意外と面倒そうなのです。
という訳で、dmesg でサクッと情報をみることができる
dev_info()関数を使ってみました。
dev_info(component->dev, "hw_params %u Hz, %u channels\n",
params_rate(params), params_channels(params));
のような感じのコードを挿入。printf()と構文が似てますね。やってる事もprintfデバッグに近いです。
I2Cに送信した内容をdev_info()で出力して、オシロでI2C通信を見ると、命令発行と実際の信号とが一致しているのか確認できます。
デバッグが終わったらdev_info()を消しておくのを忘れずに。dmesgがゴミメッセージだらけになりますからね。
以下、参考まで(2020-08-20-raspios-buster)
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.4.51-v7+ #1333 SMP Mon Aug 10 16:45:19 BST 2020 armv7l GNU/Linux
pi@raspberrypi:~ $ cat /etc/rpi-issue
Raspberry Pi reference 2020-08-20
Generated using pi-gen, https://github.com/RPi-Distro/pi-gen, 9a3a10bf1019ebb2d59053564dc6b90068bad27d, stage2
pi@raspberrypi:~ $ vcgencmd version
Aug 19 2020 17:40:15
Copyright (c) 2012 Broadcom
version e90cba19a98a0d1f2ef086b9cafcbca00778f094 (clean) (release) (start)
にほんブログ村
ブログランキングに参加中です。 めざせ1位!
もしよろしければ「ぽちっと」お願いします。
« Volumio2.834用のSabreberry32ドライバをリリース | トップページ | PCに組み込むヘッドホンアンプ Sound RABBIT & 900万PVありがとう企画 »
「Raspberry Pi」カテゴリの記事
- MotionEyeと余っているラズパイで監視カメラ(2024.11.21)
- 秋の夜長にはRaspberryPi5 RT-linux セルフビルド(2024.10.13)
- 秋の夜長にはRaspberryPi5 64bit版 Sabreberry32 ドライバコンパイル(2024.10.10)
- RaspberryPi 5 の公式OSは32bit版でも64bit?(2024.10.09)
- 秋の夜長にはRaspberry Pi5 64bit カーネル・セフル・ビルド (2024.10.07)
「Sabreberry32」カテゴリの記事
- 秋の夜長にはRaspberryPi5 64bit版 Sabreberry32 ドライバコンパイル(2024.10.10)
- Moode Audio R8.3.3用のSabreberry32ドライバ(2023.07.30)
- Moode Audio R8.0.1用のSabreberry32ドライバリリース(2022.03.31)
- Volumio3.179用のSabreberry32ドライバをリリース(2021.12.30)
- Moode Audio R7.3.0用のSabreberry32ドライバリリース(2021.08.17)
コメント
« Volumio2.834用のSabreberry32ドライバをリリース | トップページ | PCに組み込むヘッドホンアンプ Sound RABBIT & 900万PVありがとう企画 »
何十年か前はカーネルバージョンを追っかけてましたが、もう全然(笑)
ライナスは4→5で大きく変わったのはその数字くらいみたいな言い方してますが、エライ違いですねぇ。
投稿: 天 婦羅夫 | 2020年10月 5日 (月) 10時47分
天 婦羅夫さん
5.0への移行時はそうだったのかもしれませんね。 4.19->5.4では、さすがに変化が大きかったようです。
新しいものをどんどん取り込んでいくLinuxらしさを、ひしひしと感じております。メンテナーさん大変だろうなっと。
> 何十年か前はカーネルバージョンを追っかけてましたが、もう全然(笑)
「何十年」って。。すごいです。
最初に遊んだのは Run Run Linuxって本で、付録のSlackware は kernel 2.4 あたり? 97年ころ。
投稿: たかじん | 2020年10月 5日 (月) 22時21分
ご無沙汰しております。
Volumio version 2.806用のSabreberr32ドライバーのコンパイルの件です。8月10日にPi 3Bでセルフコンパイルしました。この時は、makefileは、 make -C $(KERNEL_SRC) SUBDIRS=$(BUILD_DIR) のままで、ちゃんとコンパイルできました。そして、再生スピードも正常です。snd_soc_component_update_bits()関数の後にmdelay(5)を挿入するなどは行っておりません。
しかし、10月5日にたかじんさんのこの記事を読んだ後、同じイメージファイルを用いて、再度Pi3Bでセルフコンパイルしたところ、エラーでコンパイルできませんでした。そこで、makefileのSUBDIRS=$(BUILD_DIR)をM=$(BUILD_DIR)に変更した結果、コンパイルできました。再生スピードの問題もありません。
version 2.834については、makefileをM=$(BUILD_DIR)に変更して、コンパイルできております。再生スピードの問題もありません。
8月10日から10月5日の間で、なんらかの変更があったのではないかと思います。なお、kernelは、両方とも、4.19.118-v7+です。
Volumio設定画面のプレイバックオプションのオーディオ出力選択部で、Sabreberry32DAC-MasterやSlaveを選択する時に一度で設定できないことがあります。また、いつの間にか、Sabreberry32DACで動作しているのに、R-PI DACに名前だけ変わっていることもあります。バグかもしれません。
私のコンパイルしたドライバーを送ることも可能ですので、必要でしたらメールでお知らせください。
長くなりましたが、以上です。
投稿: あすか | 2020年10月 7日 (水) 20時40分
あすかさん
ご報告ありがとうございます。
そうなんですね。kernelソース以外にも、build-essentialなどのバージョンの違いも可能性ありますもんね。私はgcc 4.9を入れてコンパイルしています。記事中には書きませんでしたが、Pi3BとPi3B+とで挙動が異なっていたりもしました。Pi4も違うというか、Pi4は安定して動きます。
Raspberry本家の方も開発をPi4にシフトしているのかもしれませんね。
現時点で4.19.118も5.4.51も大丈夫になったので、とりあえずは一安心しています。
Volumioは、ほぼ使えないレベルのバグの嵐だった一時期に比べると、良くなりましたね。kernel 5.4に移行するとき、またバグだらけになる可能性もあり油断できません。
まあ、これだけ複雑なプログラム、よく動いてますよね。Linuxって。本当に関心します。
投稿: たかじん | 2020年10月 8日 (木) 23時31分
たかじんさん
こんにちは、FlatTwinです。
ご無沙汰しております。
久々にSB32を引っ張り出して、Pi3B+と組み合わせて鳴らそうとしています。
しかし、最新のRaspi OS liteではカーネルが5.10.17になっていて、ドライバのコンパイルではまってます。
カーネル5.x対応のソースをいただくことはできますか?
よろしくお願いいたします。
投稿: FlatTwin | 2021年7月16日 (金) 21時12分
FlatTwin さん
このときの5.4.xx用のソースは提供できます。
下記までメールください。
new_western_electric@yahoo.co.jp
よろしくお願いいたします。
投稿: たかじん | 2021年7月16日 (金) 21時34分