Raspberry Pi 2 カーネル4.0.7のクロスコンパイルメモ

(参考サイト)

Kernel Building - Raspberry Pi Documentation

RaspberryPi - Raspberry Piのカーネルをクロスコンパイルする - Qiita

Raspberry Pi2のカーネルの再構築とGW-450Dを使えるようにする。 - 石を売る

raspberry pi 2のカーネルソースとツール取得

githubから取得。git pullしないなら--depth 1 をつけた方が早く取得できると思う。

$ git clone https://github.com/raspberrypi/linux.git
$ git clone https://github.com/raspberrypi/tools.git

取得した時点で4.0.7だった。

pi@raspberrypi ~ $ uname -a
Linux raspberrypi 4.0.7-v7+ #3 SMP PREEMPT Wed Jul 8 23:31:48 JST 2015 armv7l GNU/Linux

環境構築 CentOS 6.6 x86_64

いろいろと怒られたので、zlib.i686とlibstdc++.i686yumで導入した。

$ sudo yum install zlib.i686 libstdc++.i686

ビルド

config設定

下記コマンドでデフォルトのコンフィグで.configが生成される。旧Raspberry Piの場合は引数が違うらしいので注意。

$ make ARCH=arm bcm2709_defconfig

カーネルカーネルモジュール、デバイスツリーのビルド

gitで取得したtoolsのパスをCROSS_COMPILE以降に適切に入力する。

64bit CentOSでトライしたものの、x64だとライブラリが不足していたので32bitツールチェインでコンパイルした。

$ make ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- zImage modules dtbs

コンパイルされたものを集める

適当なディレクトリを作っておいて、そちらにモジュールやらカーネルイメージやらを集める。 下記のコマンドだとtemp以下に集まる。

$ mkdir temp
$ mkdir temp/overlays
$ make ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- INSTALL_MOD_PATH=./temp  modules_install
$ scripts/mkknlimg arch/arm/boot/zImage temp/kernel7.img
$ cp arch/arm/boot/dts/*.dtb temp
$ cp arch/arm/boot/dts/overlays/*.dtb* temp/overlays
$ cp arch/arm/boot/dts/overlays/README temp/overlays

sourceとbuildのシンボリックリンクが出来ていたので、転送サイズを減らすためにも消しておく。

シンボリックリンクを削除するので、パスの最後に/を付けないように注意。

$ rm temp/lib/modules/4.0.7-v7+/source temp/lib/modules/4.0.7-v7+/build

インストール

Raspberry Pi2の場合、カーネルイメージは/boot/kernel7.imgらしい。7が付いていない方は旧Raspberry Pi用とのこと。

適当なディレクトリ下に集めた雑多なファイルをRaspberry Pi2にscpして、下記コマンドをRaspberry Pi上で実行する。

$ sudo cp temp/kernel7.img /boot/kernel7.img
$ sudo cp -r temp/lib /
$ sudo chown -R root /lib/modules
$ sudo chgrp -R root /lib/modules
$ sudo cp temp/*dtb /boot
$ sudo cp -r temp/overlays/ /boot

終わったら再起動する。失敗すると虹色画面で止まってしまうので、LED点灯が消えたら電源OFFして、SDカードの中身を修復してやりなおし。

AndroidのLogについて

出力方法

Logクラスのメソッドを使う。 Log.dのように、ログレベルの頭文字のメソッドが用意されている。

ERRORより酷いエラー*1の場合は、wtf *2 メソッドを使う。

フォーマット

幾つかある。logcat -v <format_name> でフォーマット指定が可能。

  • threadtime
    • [日付] [時刻] [PID?]-[TID?]/[アプリ名] [ログレベル]/[TAG]: [本文]

      04-25 08:36:48.633 5265-5306/com.sample.hoge.test I/OpenGLRenderer﹕ Initialized EGL, version 1.4

ログレベル

  • VERBOSE
  • DEBUG
  • INFO
  • WARN
  • ERROR

リリース版では出力を抑制する方法

ProGuardを使ったハックがあるらしい。

穀風: Android の Log をリリース時にだけ表示しないようにする方法

*1:本来、起こり得ないエラーなど

*2:What a Terrible Failureの略らしいけれど...