この投稿では、Gumstixの基本的な開発環境の構築方法を書きます。
ハードウェア準備
今回は、ハードウェアとして
- Gumstix Overo Fire Storm COM
- 拡張IFボードTOBI
- マイクロSDカード(4GB)
を用いました。
下の写真の左がGumstix本体、右が拡張ボード(TOBIボード)になります。拡張ボードの中央にコネクタが2ヶ所あるので、そこに嵌めこむようにします。
マイク、スピーカ以外の外部IFを接続すると下図のようになります。ただし、HDMIは、Xを出力しない場合には、使用しません。
Xは、見た目の雰囲気がわかるのでいいですが、そこまで軽くはないので、今回は、Xなしのイメージを作ることにします。他にも
USBも一口あり、USBカメラなどを接続して使用することができます。
開発環境(OpenEmbedded)の準備
Gumstixは、DSPを備えていることが大きな特徴の一つですが、そのDSPに対応したプログラムを開発するためには、DSPのドライバがサポートされているOpenEmbedded環境を利用して、カーネルとルートファイルシステムを構築する必要があります。ここでは、例として、Ubuntu12.04 64bit環境にOpenEmbedded環境を構築する方法を記します。
以下、下記の公式サイトの英語ドキュメントから情報をかいつまんで説明します。
http://gumstix.org/software-development/open-embedded/61-using-the-open-embedded-build-system.html
また、hostpc$ は、開発用ホストPCでの作業を、GX$ はGumstix側での作業を示すものとします。
まずは、ホストマシン側で、以下のパッケージをaptでインストールします。
hostpc$ sudo apt-get install git-core subversion help2man texinfo diffstat libncurses-dev cvs python-dev unzip chrpath ccache texi2html gawk g++
次に、/bin/sh が /bin/dashへのリンクになっていたら、/bin/bashへのリンクに変更します。
hostpc$ sudo ln -sf /bin/bash /bin/sh
そして,gitで開発環境のソース一式を持ってきます。
hostpc$ mkdir -p ~/overo-oe hostpc$ cd ~/overo-oe hostpc$ git clone git://gitorious.org/gumstix-oe/mainline.git org.openembedded.dev hostpc$ cd org.openembedded.dev hostpc$ git checkout --track -b overo-2011.03 origin/overo-2011.03
次に、ビルドのためのテンプレート群があるので、それをコピーしてbashで読み込むようにします。
hostpc$ cd ~/overo-oe hostpc$ cp -r org.openembedded.dev/contrib/gumstix/build . hostpc$ cp ~/.bashrc ~/bashrc.bak hostpc$ cat ~/overo-oe/build/profile >> ~/.bashrc
OpenEmbedded環境では、クロスビルドを行うためにbitbakeというコマンドを使用しますが、そのbitbakeはaptで入るものでなく、gitで特定のバージョンを持ってくるようにします。
hostpc$ sudo apt-get remove bitbake hostpc$ cd ~/overo-oe hostpc$ git clone git://git.openembedded.org/bitbake bitbake hostpc$ cd bitbake hostpc$ git checkout 1.12.0
ここまで来たら、以下の手順を行うことで、ルートファイルシステムのイメージを作ることができます。
hostpc$ cd ~/overo-oe/ hostpc$ source ~/.bashrc hostpc$ bitbake omap3-console-image
ちなみに、マルチコアな環境であれば、~/overo-oe/build/conf の site.conf にマルチコアコンパイルの設定をするとmakeが速くなります。体感では1/3程度になります。
PARALLEL_MAKE = "-j 4" BB_NUMBER_THREADS = "4"
をそれぞれアンコメントし、PARALLEL_MAKEの方はCPU数+1の数字にすると良いです。
【トラブルシューティング】
◯OpenSSLのコンパイルが失敗する
ホストPCが64bitの場合OpenSSLのコンパイルが失敗することがあります。その場合、以下のようにしてパッチを戻す作業を行います。
hostpc$ patch -R ~/overo-oe/tmp/work/x86_64-linux/openssl-native-1.0.0d-r14.0/openssl-1.0.0d/Makefile.shared ~/overo-oe/tmp/work/x86_64-linux/openssl-native-1.0.0d-r14.0/openssl-1.0.0d/patches/libdeps-first.patch
この後に再度bitbake omap3-console-imageを行えば通るはずです。
◯pango_1.24.4.bb failed となる
なぜか.hファイルが足りないようなので、下記のようにします。
hostpc$ bitbake -c clean pango hostpc$ bitbake pango hostpc$ bitbake omap3-console-image
とするか、
hostpc$ bitbake -c clean cairo-native hostpc$ bitbake -c clean pango-native hostpc$ bitbake cairo-native hostpc$ bitbake pango-native hostpc$ bitbake omap3-console-image
とすると良いようです。何度か試すと通ることもあります。
◯linux-omap3_git.bb failed が出る
リンクが死んでるらしいのでリンクの差し替えを行います。
…/org.openembedded.dev/recipes/linux/linux-omap3_git.bb
を開いて、
git://www.sakoman.com/git/linux-omap-2.6.git を
git://www.sakoman.com/git/linux.git に変更します。
◯rt73-firmware_1.8.bb failed が出る
RT71W_Firmware_V1.8.zip がおかしい(ハッシュが違う)のでファイルを直接ダウンロードして ~/overo-oe/sources に上書きをします。
OpemEmbedded環境によるカーネルイメージの構築
次に,http://wiki.gumstix.org/index.php?title=Kernel_Reconfiguration
を参照して,カーネルをコンパイルします。
hostpc$ bitbake -c clean virtual/kernel hostpc$ bitbake -c menuconfig virtual/kernel
でmenuconfigできます。menuconfigが無反応になってしまう場合には、bitbake -c menuconfig を実行した端末とは違う端末で
hostpc$ screen –r
を実行すると新たなウィンドウに選択肢が表示されるようになります。実際のカーネルのコンパイルは以下のコマンドで行います。
hostpc$ bitbake virtual/kernel
SDカードへの書き出しとカーネルパラメータの設定
今までのところで、カーネルとルートファイルシステムはできましたが、Gumstixを起動するには更に、対応するMLOとu-boot.binが必要です。そのコンパイルもbitbakeで行うことができますが、ここでは、
http://cumulus.gumstix.org/images/angstrom/factory/2011-03-25-1619/MLO
http://cumulus.gumstix.org/images/angstrom/factory/2011-03-25-1619/u-boot.bin
にあるAngstrom用のprebuiltバージョンのものを利用することにします。
それ以外は、
~/overo-oe/tmp/deploy/glibc/images/overo/ にある
Angstrom-omap3-console-image-glibc-ipk-2011.03-overo.rootfs.tar.bz2
uImage-3.2-r103-overo.bin
modules-3.2-r103-overo.tgz
を用います。上から順に、ルートファイルシステム、カーネルイメージ、カーネルモジュールに対応しています。
次に、以下の要領で、SDカードのパーティションを切ります。マイクロSDカードのパーティション作成は、
http://www.gumstix.org/create-a-bootable-microsd-card.html
を参考にします。
まずは、microSDをSDカードアダプタに指して、Ubuntuマシンで認識できるようにします。USBカードリーダにSDカードアダプタにさしたものを入れて、Ubuntu側で認識させます。
hostpc$ sudo tail -f /var/log/syslog
でどこに割り当てられたかを確認します。もし,既にマウントされているようであれば,unmountしておきます。今回は/dev/mmcblk0に割り当てられたことがわかったので、次のようにしてcfdiskを起動します。
hostpc$ sudo cfdisk /dev/mmcblk0
ここでで,mmcblk0p1 をBootable, Primary, W95 FAT32, 64MBで作り,mmcblk0p2は Primary, Linuxで残りとして,Writeします。
次に,各々のパーティションをフォーマットします。
hostpc$ sudo mkfs.vfat -F 32 /dev/mmcblk0p1 -n boot hostpc$ sudo mke2fs -j -L rootfs /dev/mmcblk0p2
最後に,マウントポイントを作り,マウントした後、マイクロSDへのデータ書き込みを行います。
hostpc$ sudo mkdir /media/boot hostpc$ sudo mkdir /media/rootfs hostpc$ sudo mount -t vfat /dev/ mmcblk0p1 /media/boot hostpc$ sudo mount -t ext3 /dev/mmcblk0p2 /media/rootfs
この時、/media/bootには,MLO, u-boot.bin, uImageを,/media/rootfsには,ルートファイルシステムをコピーします。ルートファイルシステムは下記のように展開します。
hostpc$ sudo tar xvaf tmp/deploy/glibc/images/overo/Angstrom-omap3-console-image-glibc-ipk-2011.03-overo.rootfs.tar.bz2 -C /media/rootfs/
続いて、カーネルイメージとモジュールをそれぞれ、SDカードにコピーします。
hostpc$ sudo cp tmp/deploy/glibc/images/overo/uImage-3.2-r103-overo.bin /media/boot/uImage hostpc$ sudo cp tmp/deploy/glibc/images/overo/uImage-3.2-r103-overo.bin /media/rootfs/boot/uImage hostpc$ cd /media/rootfs/ hostpc$ sudo tar xvzf /home/username/overo-oe/tmp/deploy/glibc/images/overo/modules-3.2-r103-overo.tgz
SDカードの内容を書き換える際には,今動いているもののコピーをとるのが良い習慣です。
hostpc$ sudo dd if=/dev/sdc bs=256M | gzip -c > backupimg.gz
で、バックアップコピーを残すことができます。戻すときには,
hostpc$ gunzip –c backupimg.gz | sudo dd of=/dev/sdc bs=256M
とすれば戻せます。
これで,全てSDカードの準備は完了したので、/media/boot, /media/rootfsをumountして、マイクロSDをGumstixにさして、電源投入します。起動確認はまずはシリアルコンソールで行います。ホストマシンがUbuntuの場合、cuというコマンドがあるので、それを利用します。なければ、sudo apt-get install cuをおこなってcuをインストールします。コマンドラインからは、
hostpc$ sudo cu -s 115200 -l /dev/ttyUSB0
で接続を行うことができます。
もし、
cu: open (/dev/ttyUSB0): Permission denied cu: /dev/ttyUSB0: Line in use
と表示されたら、権限を与えるために以下をおこなってから再度接続を行います。
hostpc$ sudo chmod 666 /dev/ttyUSB0
或いは、dialoutグループにローカルユーザをaddすると、sudoなしでも接続できるようになります。Windowsから接続する場合には、Teraterm等のターミナルソフトで115200 8Nでシリアル設定をして開きます。バスパワー駆動はできないため,電源を繋いでおくことが必要です。
これで、正しいイメージが読み込まれれば、無事起動して、Loginと出てくるので、ユーザはroot、パスワードなしでログインすることができます。
以上で基本的な開発環境は整いました。