Select Your Language

免責事項

  • 本サイトの情報の利用、内容、サービスによって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。

    本サイトで頒布している基板およびキットは、技術者、またはそれに準ずる電気的知識をお持ちの電子工作ファンの方のためのものです。一般のオーディオファンの方のためのものではありません。
    また、頒布基板およびキットは、いかなる条件でも動作を保証するものではございませんので、あらかじめご了承ください。

    電子工作では、火傷、感電、火災などの可能性があります。十分に注意をして作業して下さい。

    営利目的のご使用は認めておりません。 記事の転載や、基板・キットの商用利用の方は、ご連絡ください。学生やサークルの学習目的でまとめてご購入する場合は特別価格でご提供させていただきます。

スポンサー

無料ブログはココログ

« Volumio2.834用のSabreberry32ドライバをリリース | トップページ | PCに組み込むヘッドホンアンプ Sound RABBIT & 900万PVありがとう企画 »

2020年10月 5日 (月)

Raspberry Pi OSがkernel 5.x系に移行 ドライバモジュールのコンパイル方法も変更に

いままでRaspbianと呼んでいた公式のOSの名称がRaspberry Pi OSに変わっていました。

DebianをベースにRaspberryPi用にカスタマイズしていたディストリビューションだからRaspbianという名称だったのですが、完全に独立したくなったのでしょうか。

Raspios

現在最新の「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するしかないですね。これは。

Raspi_debug1
 < i2c信号は、OLEDを接続するためのポートから >

 

Raspi_debug2
 < i2cコマンド解析 オシロに搭載されている便利機能 >

 

ドライバの動作を単純に書くと、再生する曲のサンプリング周波数に合わせて

 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()関数を使ってみました。

Raspi_debug3

dev_info(component->dev, "hw_params %u Hz, %u channels\n",
params_rate(params), params_channels(params));

のような感じのコードを挿入。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)

 

 

 

 

にほんブログ村 PC家電ブログ PCオーディオへ にほんブログ村

ブログランキングに参加中です。 めざせ1位! 

もしよろしければ「ぽちっと」お願いします。 

« Volumio2.834用のSabreberry32ドライバをリリース | トップページ | PCに組み込むヘッドホンアンプ Sound RABBIT & 900万PVありがとう企画 »

Raspberry Pi」カテゴリの記事

コメント

何十年か前はカーネルバージョンを追っかけてましたが、もう全然(笑)
ライナスは4→5で大きく変わったのはその数字くらいみたいな言い方してますが、エライ違いですねぇ。

天 婦羅夫さん

5.0への移行時はそうだったのかもしれませんね。 4.19->5.4では、さすがに変化が大きかったようです。
新しいものをどんどん取り込んでいくLinuxらしさを、ひしひしと感じております。メンテナーさん大変だろうなっと。

> 何十年か前はカーネルバージョンを追っかけてましたが、もう全然(笑)
「何十年」って。。すごいです。
最初に遊んだのは Run Run Linuxって本で、付録のSlackware は kernel 2.4 あたり? 97年ころ。

 ご無沙汰しております。
 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に名前だけ変わっていることもあります。バグかもしれません。
 私のコンパイルしたドライバーを送ることも可能ですので、必要でしたらメールでお知らせください。
 長くなりましたが、以上です。

あすかさん

ご報告ありがとうございます。
そうなんですね。kernelソース以外にも、build-essentialなどのバージョンの違いも可能性ありますもんね。私はgcc 4.9を入れてコンパイルしています。記事中には書きませんでしたが、Pi3BとPi3B+とで挙動が異なっていたりもしました。Pi4も違うというか、Pi4は安定して動きます。
Raspberry本家の方も開発をPi4にシフトしているのかもしれませんね。

現時点で4.19.118も5.4.51も大丈夫になったので、とりあえずは一安心しています。

Volumioは、ほぼ使えないレベルのバグの嵐だった一時期に比べると、良くなりましたね。kernel 5.4に移行するとき、またバグだらけになる可能性もあり油断できません。

まあ、これだけ複雑なプログラム、よく動いてますよね。Linuxって。本当に関心します。

コメントを書く

(ウェブ上には掲載しません)

« Volumio2.834用のSabreberry32ドライバをリリース | トップページ | PCに組み込むヘッドホンアンプ Sound RABBIT & 900万PVありがとう企画 »

サイト内検索

Sponsors link

2020年10月
        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