Raspberry Piのドライバを開発したいので、raspberrypi 3.18.12+のカーネルをgitから取得して、Ubuntu(Ver:12.04 LTS)に、Raspberry Piカーネルクロスコンパイル環境を構築しました。
カーネルクロスコンパイル必要なパッケージをあらかじめインストール
「build-essential」はmakeコマンドとmenuconfig用のセルフコンパイル環境のため、libncurses5-devは、「menuconfig」実行時に次のエラーが出るのであらかじめインストールしておきます。
scripts/kconfig/lxdialog/dialog.h:38:20: 致命的エラー: curses.h: そのようなファイルやディレクトリはありません
コンパイルを停止しました。
make[1]: *** [scripts/kconfig/mconf.o] エラー 1
make: *** [menuconfig] エラー 2
$ sudo apt-get install build-essential libncurses5-dev
Raspberry Piカーネルソースとコンパイルツールの入手
git「https://github.com/raspberrypi」からRaspberry Pi関係のソースやツールを取得します。カーネルクロスコンパイルに必要なリポジトリはlinuxとtoolsとなります。作業用のディレクトリ「raspi」を作りました。
$ mkdir raspi $ cd ./raspi $ git clone https://github.com/raspberrypi/linux.git $ git clone https://github.com/raspberrypi/tools.git
カーネルクロスコンパイルの準備
ひとつ下のlinuxディレクトリに移動し、Raspberry Pi上にある設定ファイルをscpコマンドで取得して、configファイルを作成する.
$ cd ./linux $ scp pi@raspberrypi:/proc/config.gz ./ $ zcat config.gz > .config
make oldconfigを実行してコンフィグを反映します。
$ make CROSS_COMPILE=~/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- ARCH=arm oldconfig
make menuconfigでダイアログが表示され、好きなオプションがカーネルに追加できます
$ make CROSS_COMPILE=~/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- ARCH=arm menuconfig
いろいろ聞かれますが すべてデフォルトにしました。menuconfigではloadしてsaveしてexitしました。
Raspberry Piカーネルビルド
コマンドが長くなるのでexportします。
$ export CCPREFIX=../tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
ジョブ数の指定を、-j8にします。
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j8
tmpディレクトリを作ってそこに作成したモジュールをいれます。
$ mkdir tmp $ make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules -j8 $ make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=./tmp modules_install -j8
Raspberry Piに作成したカーネルを設定
ビルドしたモジュールファイルを、tarアーカイブにまとめます(まとめた方が転送が早く終わります)。scpで作成したカーネルをRaspberry Piに送ります。このカーネルイメージを次のコマンドで然るべき場所にコピーしてrebootすれば完了します。
$ tar czvf lib.tar.gz ./tmp/lib $ scp -rp ./arch/arm/boot/zImage pi@raspberrypi:~/ $ scp -rp lib.tar.gz pi@raspberrypi:~/ $ ssh pi@raspberrypi pi@raspberrypi $ tar xzvf lib.tar.gz pi@raspberrypi $ sudo cp -rp ./lib / pi@raspberrypi $ sudo cp ./zImage /boot/kernel.img pi@raspberrypi $ sudo reboot
「uname -a」コマンドでカーネルのバージョンを確認します。
【変更前】
pi@raspberrypi $ uname -a Linux raspberrypi 3.18.10+ #1 PREEMPT Fri Mar 27 17:08:57 CET 2015 armv6l GNU/Linux
【変更後】
pi@raspberrypi $ uname -a Linux raspberrypi 3.18.12+ #1 PREEMPT Tue May 5 05:35:35 JST 2015 armv6l GNU/Linux
Raspberry PiイメージをSDカードに作成
ddrescueを使います。ddrescueはhomebrewをつかってインストールします。
イメージは~/Downloadsの下に置いて SDカードはdisk5s1と認識されました。SDカードをアンマウントしてから次のコマンドを入力します。
sudo ddrescue ~/Downloads/2013-09-25-wheezy-raspbian.img /dev/disk5s1