Beagleboardでのアプリ開発
前ページでBeagleboardへLinuxディストリビューションをインストールしました。 以下で紹介するアプリケーション開発手順では、クロスコンパイル環境として別項で紹介したARMツールチェーンを使い、ルートファイルシステムとして Ubuntu Rootstockを使っています。
カーネルコンパイル
Beagleboardを、超小型Linuxマシンととらえれば、Linuxディストリビューションがインストールできれば、ある程度利用の目処が立つと思います。
apt-getを使って、目的のサーバーを作る事も簡単に出来ます。
ただ、高機能な組込みワンボードマイコンととらえた場合は、いずれは独自のカーネルが必要になることと思います。
カーネルコンパイルも、apt-getを使ってセルフコンパイルする事も可能ですが、やはり、クロスコンパイルの方が早いはずです。
Ubuntu 12.04に使われているカーネルは3.2.0ですので
kernel.orgよりlinux-3.2.tar.bz2を入手します。
mkdir kernel
cd kernel
wget http://kernel.org/pub/linux/kernel/v3x/linux-3.2.tar.bz2
tar jxvf linux-3.2.tar.bz2
omap用のpatchとdefconfigをここから入手することが出来ます。
wget http://rcn-ee.net/deb/precise-armel/v3.2.0-x1/defconfig
wget http://rcn-ee.net/deb/precise-armel/v3.2.0-x1/patch-3.2-x1.diff.gz
パッチを当てます。
cd linux-3.2
patch -p1 < ../patch-3.2-x1.diff
パッチによってarch/arm/configsに、omap3_defconfigが作成されますが、このコンフィグを使うとエラーで止まってしまうので
先ほどダウンロードした、defconfigを使います。
cd ../.
cp defconfig linux-3.2/arch/arm/configs/omap3_beagle_defconfig
準備が整ったので、カーネルをコンパイルします。
cd linux-3.2
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- omap3_beagle_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig (必要に応じて)
Makefileのエキストラバージョンを適当に設定します。
geditなりviでMakefileを編集します。
gedit Makefile
EXTRAVERSION = -x1
makeします
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage
Image arch/arm/boot/uImage is ready
これで、カーネルイメージが出来上がるので、SDカードにコピーします。
cp arch/arm/boot/uImage /media/boot
続いて、モジュールをコンパイルし、適当な場所を作りインストールします。
mkdir modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=./modules modules_install
./modules/にモジュールがインストールされるので、SDカードにコピーします。
cd modules/lib
sudo cp * /media/rootfs/lib -r
これで、カーネルのコンパイルは終了です。作成したSDカードから起動できると思います。
ただ、この状態ではuInitrdは古いままです。(u-bootから直接uImageを起動することも出来ますが)
本来、uInitrdの元となるinitrd.imgはx86の場合、/usr/sbin/mkinitramfsで作りますが、クロスコンパイルでは使うことはでません。
mkinitramfsはシェルスクリプトなので、中を確認すれば何をやっているかは確認できます。
大雑把に言えば、ラムディスクとして読込まれて最初に起動されるinitスクリプトがあり、
init内で使われるコマンド郡をスタティックコンパイルしたbusyboを用意、
デバイスドライバーを準備し、/devや/sys /procなどのファイルシステムを作成しています。
とはいえ、これを一から作るのはなかなか大変です。なのでここでは、
セルフコンパイルで、update-initramfsを使います。
幸い、今回の場合は古いuInitrdで問題なく起動できるので、update-initramfsが使えますが、カーネルのバージョンの差が大きく起動できない場合などには
ラムディスクを使わずにカーネルを起動する手があると思います。この場合、AngstromのSDカードが参考になると思います。
update-initramfs -c -k 3.2-x1
grep: /boot/config-3.2-x1: No such file or directory とのメッセージは出るが、
/boot/initrd.img-3.2-x1 が作成される。これをホスト機にコピーしなおして、uInitrdを作ります。
mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d ./initrd.img-* ./uInitrd
で再度、uInitrdをターゲットにコピーします。
cp uInitrd /media/boot
以上で、3.2-x1のカーネルが出来上がりです。