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

  • 投稿日:
  • by
  • カテゴリ:

最近のRaspbianではどうも以前の手法ではどうもうまくいかない。仕方ないので、カーネルを再構築することにした。

Debian7だとtoolchainのlibcのバージョンが違うのでややこしそうな感じだったので、 VMware上にUbuntu 14.04(Desktop) LTS 64bit をインストールして作業することにした。 .configを取得するため、事前にRaspbianを入れたRaspberry Pi2にSSH接続できるようにしておく。

以下、Ubuntu上で作業

カーネル構築

必要なツールのインストール

$ sudo aptitude install build-essential git openssh-server ncurses-dev

build-essentialはビルドに必要 gitはダウンロードに必要 openssh-serverはリモートから作業したい場合 ncurses-devはmenuconfigで使う。

toolchainとkernel sourceのダウンロード

$ git clone --depth=1 git://github.com/raspberrypi/tools.git
$ git clone --depth=1 git://github.com/raspberrypi/linux.git

環境変数の設定

$ ls tools/arm-bcm2708
$ export PATH=`pwd`/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH

エラーがでないか確認

$ arm-linux-gnueabihf-gcc -v

クロスコンパイルの設定など

$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-

カーネルコンパイルの準備

Raspberry PiとRaspberry Pi2とではアーキテクチャーが違う。 Piは ARMv6で Pi2は ARMv7。 Piの場合は /boot/kernel.img が起動されるが、 Pi2の場合は/boot/kernel7.imgが起動されるようだ。

参考

How to compile RPi2/Kernel7.img

List of ARM microarchitectures

デフォルトのconfigは $ make bcmrpi_defconfig でつくれる。

raspberrypi.local から configを取得する。

raspberrypi.local はターゲットの Raspberry Pi2 のアドレス

$ cd linux
$ ssh pi@raspberrypi.local 'zcat /proc/config.gz' > config-rpi2
$ cp config-rpi2 .config

名前をつける

EXTRAVERSIONを編集してカーネルにわかりやすい名前をつける。

$ vim Makefile
EXTRAVERSION = -mng1

menuconfigの実行

$ make menuconfig

特に変更がなければ、そのまま[ Exit ]

カーネルのビルド

$ make -j 9

-j はCPUの数 x 1.5くらいがいいらしい。

モジュールとカーネルをまとめる

$ cat include/config/kernel.release
3.18.7-mng1-v7+
$ export KERNEL_RELEASE=`cat include/config/kernel.release`
$ export INSTALL_MOD_PATH=../$KERNEL_RELEASE
$ mkdir -p $INSTALL_MOD_PATH
$ mkdir -p ../$KERNEL_RELEASE/boot
$ make modules
$ make modules_install
$ cp arch/arm/boot/Image ../$KERNEL_RELEASE/boot/kernel-$KERNEL_RELEASE.img
$ cd ..

GW-450Dのドライバ構築

事前にUbuntuに mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2 送っておく。これは gw-450d_driver_linux_v3002.zip を展開するとでてくる。

環境変数の確認

$ echo $PATH
/home/username/work/raspberry/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

$ echo $ARCH
arm

$ echo $CROSS_COMPILE
arm-linux-gnueabihf-

$ echo $KERNEL_RELEASE
3.18.7-mng1-v7+

展開とパッチ当て

パッチを一つふやした

$ tar jxvf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
$ wget https://gist.githubusercontent.com/mamemomonga/d15c70f8b8e315ecdede/raw/0c06fbcdf06733a3fcd8c34071140c78c41efeb6/gw-450d-raspbian.patch
$ wget https://gist.githubusercontent.com/mamemomonga/d15c70f8b8e315ecdede/raw/3150768d5ad22d26082e9932e618c6ef2ebfe576/gw-450d-raspbian2.patch
$ patch -p0 < gw-450d-raspbian.patch
$ patch -p0 < gw-450d-raspbian2.patch
$ cd mt7610u_wifi_sta_v3002_dpo_20130916
$ LINUX_SRC=../linux/ make

ドライバなどをコピー

$ mkdir -p ../$KERNEL_RELEASE/etc/Wireless/RT2870STA
$ cp RT2870STA.dat ../$KERNEL_RELEASE/etc/Wireless/RT2870STA
$ cp os/linux/mt7610u_sta.ko ../$KERNEL_RELEASE/lib/modules/$KERNEL_RELEASE/kernel/drivers/net/wireless/
$ cd ..

圧縮と転送

$ cd $KERNEL_RELEASE
$ tar zcvf $KERNEL_RELEASE.tar.gz boot etc lib
$ scp $KERNEL_RELEASE.tar.gz pi@raspberrypi.local:/home/pi/

以下 raspberrypi.local で作業

ファイル名は$KERNEL_NAMEなので、自分の設定に合わせて読み替えて下さい。

$ sudo tar zxC / -f 3.18.7-mng1-v7+.tar.gz

boot/kernel-3.18.7-mng1-v7+.img: Cannot change ownership というエラーはたぶん気にしなくていい。

$ ls /boot/kernel-*
/boot/kernel-3.18.7-mng1-v7+.img

起動時にロードするカーネルを指定

RaspberryPi1,2で併用する場合は、Kernel.img, Kernel7.imgを入れ替えたほうがいいかもしれない。

$ sudo vim /boot/config.txt
末尾に追加
kernel=kernel-3.18.7-mng1-v7+.img

起動時にロードするモジュールを指定

追記しても depmod -a をするまでロードされない。

$ sudo vim /etc/modules
末尾に追加
mt7610u_sta

$ sudo reboot

うまく起動しなかったら、SDカードを抜いて別のマシンで config.txtを開き、追加した行を削除すればいい。

$ uname -a
Linux raspberrypi 3.18.7-mng1-v7+ #1 SMP PREEMPT Wed Feb 18 22:52:13 JST 2015 armv7l GNU/Linux

$ depmod -a

GW-450Dを刺す

$ dmesg
$ lsmod | grep mt7610u_sta
mt7610u_sta           854005  1
$ ifconfig ra0

あとは ra0 の設定をして完了。

参考URL

Kernel Building / Raspberry Pi Kernel Compilation

更新

2015/03/09 depmod -aなど追加