びぼうろく

北海道の人。適当にもっさりまったり書きます。さくら荘のましろが好きです。アニメとかパソコンとか

Raspberry Pi Zero向けのデバイスドライバを作る(環境構築)

ラズパイゼロのデバイスドライバ開発環境構築

はじめに

Raspberry Pi ZeroでHC-SR04を使いやすくするために、
デバイスドライバを作成するので、
やったことをメモしておく。
とりあえず環境構築まで<2021/08/16修正>
再度環境構築し直したときに、記載ミスに気付いたのでコマンドを修正しました。

HC-SR04について

akizukidenshi.com

超音波をつかった距離センサです。
超音波パルスを送出して、
反射した超音波を受信するまでの時間で距離を求める仕組みです。
2cm~400cmまで、0.3cmの分解能で距離を測定できる仕様となっています。
お勉強がてらこいつのデバイスドライバを作ります。

参考にさせていただいたサイト

RaspberryPi2上でデバイスドライバを作成する記事です。
組み込みLinuxデバイスドライバの作り方 (1) - Qiita

今回の私と同じく、RaspberryPiZeroのデバイスドライバを別のLinuxPCで作成する記事です。
Raspberry Pi でドライバ開発したい(基礎編) | なたで日記

RaspbianとRaspbian Kernelについて説明がある記事です。
Raspberry Pi でカーネルモジュールビルドの準備 - Qiita

開発環境作成

1. 必要なものを集める

必要なパッケージをインストール

$ sudo apt install git bc bison flex libssl-dev make


カーネルとクロスコンパイラをclone

$ git clone https://github.com/raspberrypi/linux
$ git clone https://github.com/raspberrypi/tools
2. ラズパイのカーネルバージョンのソースにする

カーネルモジュール(*.ko)を作成する場合、
ターゲット環境のカーネルバージョンを合わせておくと面倒が無い。

ターゲットのカーネルバージョンの確認する。
今回は 5.4.51+ だった。

$ uname -r
5.4.51+

同じバージョン番号のコミットをここから探す。
Commits · Hexxeh/rpi-firmware · GitHub
今回はこのコミットだった。

同じバージョン番号のコミットのハッシュ値をコピーする。
今回は、8382ece2b30be0beb87cac7f3b36824f194d01e9だった。

コミットのハッシュ値githubに投げるとカーネルのリビジョンが取得できる。
(仕組みはわからん)
今回は、ff68b68ffe3e8f1759fd17532b6fe8dc4e211a2dだった。

$ export FIRM_REV=8382ece2b30be0beb87cac7f3b36824f194d01e9
$ curl -L https://github.com/Hexxeh/rpi-firmware/raw/${FIRM_REV}/git_hash

これで、現在ターゲットのRaspbianのカーネルのリビジョンがわかったので、
先程クローンしたカーネルを、先程取得したカーネルのリビジョンでチェックアウトする。
今回はこんな感じでブランチを切った。

$ git checkout -b raspbian-5.4.51_kernel ff68b68ffe3e8f1759fd17532b6fe8dc4e211a2d
3. カーネルのビルド

ターゲットによってビルド時に設定する環境変数が異なる。
今回は、Raspberry Pi Zeroなので以下のようにビルドする。

$ export ARCH=arm
$ export KERNEL=kernel
$ make bcmrpi_defconfig
#
# configuration written to .config
#
$ export CROSS_COMPILE=/mnt/4tb/raspberrypi_kernel/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
$ make zImage modules dtbs
4. カーネルの書き込み

事前にRaspbianをmicroSDに焼いておく。
microSDをPCに接続して、ビルドしたカーネルを更新する。
今回は以下のようにした。

// マウント先ディレクトリの作成
$ sudo mkdir raspbian-boot
$ sudo mkdir raspbian

// マウント
$ sudo mount /dev/sdc1 /mnt/raspbian-boot
$ sudo mount /dev/sdc2 /mnt/raspbian

// カーネルモジュールの書き込み
$ sudo make ARCH=arm INSTALL_MOD_PATH=/mnt/raspbian/ modules_install

// カーネルのバックアップ
$ sudo cp /mnt/raspbian-boot/kernel.img /mnt/raspbian-boot/kernel_bk.img

// カーネルのコピー
$ sudo cp ./arch/arm/boot/zImage /mnt/raspbian-boot/kernel.img

// デバイスツリーのコピー
$ sudo cp ./arch/arm/boot/dts/*.dtb /mnt/raspbian-boot/.
$ sudo cp ./arch/arm/boot/dts/overlays/*.dtb* /mnt/raspbian-boot/overlays/.

// マウント解除
$ sudo umount /mnt/raspbian*

// マウント先ディレクトリの削除
$ sudo rm -rf ./raspbian*
5. 起動確認

ラズパイにmicroSDを戻して、通常通り起動するか確認する。
今回はコードに変更を加えなかったので、起動したらOKということにする