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のカーネルが出来上がりです。

inserted by FC2 system