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