PandaBoard開発
- Ubuntu on Pandaboard
- ARM Linux向けのツールチェインの作成
- SDカードの初期化方法
- u-bootのコンパイル
- x-loaderのコンパイル
- Linuxカーネルのコンパイル
- 初期RAMディスク(uInitrd)の作成
- SDカードにブートローダとカーネルをインストール
- 無線LANの使い方
Ubuntu on Pandaboard
PandaBoardにUbuntu Netbook Editionをインストールする
このページ からPandaBoard向けにビルドされたUbuntuが入手できる。 PandaBoardのCPUはomap4430なので、omap4用のイメージファイルをダウンロードする。
- ubuntu-11.04の例
wget http://cdimage.ubuntu.com/releases/11.04/release/ubuntu-11.04-preinstalled-netbook-armel+omap4.img.gz
次にイメージを書き込むためのSDカードのデバイスファイル名を次のコマンドで確認する。
sudo fdisk -l
デバイスファイル名を確認したら、次のコマンドでSDカードにイメージを書き込む。 誤ってHDD等に書き込むとシステムが破壊されるので十分に注意すること。
sudo -s
zcat ubuntu-11.04-preinstalled-netbook-armel+omap4.img.gz > /dev/[デバイスファイル名]
sync
後はイメージを書き込んだSDカードをPandaBoardに差し込んで起動し、メニューに従って設定を行えばOK。
カーネルのデバッグメッセージをシリアルコンソールから見れるようにする
sudo vi /boot/boot.script
を実行し、bootargsから'quiet'を削除し、'console=ttyO2,115200n8'を追加する。 次に、
sudo flash-kernel
を実行する。
シリアルコンソールからログインできるようにする
/etc/init/ttyO2.confに次の内容のファイルを作成し、再起動する。
# ttyO2 - getty # # This service maintains a getty on ttyO2 from the point the system is # started until it is shut down again. start on stopped rc RUNLEVEL=[2345] stop on runlevel [!2345] respawn exec /sbin/getty -L 115200 ttyO2
ARM Linux向けのツールチェインの作成
環境変数の設定
TARGET=arm-linux-gnueabi
PREFIX=$HOME/local/arm-linux-tools
SYSROOT=${PREFIX}/${TARGET}/sys-root
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
WORK=$HOME/build/arm-linux
ソースのダウンロード
cd $WORK
# binutils
wget http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2
tar jxf binutils-2.22.tar.bz2
# gcc
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.7.0/gcc-4.7.0.tar.bz2
tar jxf gcc-4.7.0.tar.bz2
# glibc (eglibc)
svn co svn://svn.eglibc.org/branches/eglibc-2_13 eglibc-2.13
cd eglibc-2.13/libc
ln -s ../ports .
# Linux (Ubuntu) kernel
git clone git://kernel.ubuntu.com/ubuntu/ubuntu-oneiric.git
Ubuntuカーネルのomap4用のブランチの最新版を取得するには、
git checkout -b working origin/ti-omap4
最新版ではインストールに失敗する場合があるので、その場合は、
git tag | grep ti-omap
してタグ名を調べて、
git checkout -b working [タグ名]
を実行する。
カーネルヘッダ
cd ${WORK}/ubuntu-oneiric
cp debian.ti-omap4/config/config.common.ubuntu .config
make menuconfig
make headers_check
make INSTALL_HDR_PATH=${SYSROOT}/usr headers_install
binutils
cd ${WORK}
mkdir build_binutils-2.22
cd build_binutils-2.22
../binutils-2.22/configure \
--prefix=${PREFIX} \
--program-prefix=${TARGET}- \
--target=${TARGET} \
--enable-lto \
--enable-interwork \
--enable-multilib \
--with-sysroot=${SYSROOT}
make -j4
make install
export PATH=$PATH:${PREFIX}/bin
gcc 1回目 (ランタイム無しのコンパイラ)
cd ${WORK}
mkdir build_gcc-4.7.0
cd build_gcc-4.7.0
../gcc-4.7.0/configure \
--enable-languages=c,c++ \
--prefix=${PREFIX} \
--program-prefix=${TARGET}- \
--target=${TARGET} \
--enable-libgomp \
--enable-libssp \
--enable-shared \
--enable-lto \
--enable-interwork \
--enable-multilib \
--enable-linker-build-id \
--with-system-zlib \
--without-included-gettext \
--enable-threads=posix \
--enable-nls \
--enable-clocale=gnu \
--with-arch=armv7-a \
--with-float=softfp \
--with-fpu=vfpv3-d16 \
--with-mode=thumb \
--disable-werror \
--enable-checking=release \
--with-sysroot=${SYSROOT}
make -j4 all-gcc
make install-gcc
glibc 1回目 (ヘッダ 静的ライブラリ crt*.o等)
libgccがまだインストールされていないので、-kオプションをつけてエラー時に終了しないようにする。
cd ${WORK}
mkdir build_eglibc-2.13
cd build_eglibc-2.13
../eglibc-2.13/libc/configure \
--prefix=/usr \
--host=${TARGET} \
--with-headers=${SYSROOT}/usr/include \
--with-tls
make -j4 -k
make install_root=${SYSROOT} -k install
libgcc.aのコンパイル時にエラーを回避するために暫定的に空のgnu/stubs.hを作成する。 このファイルはglibcの2回目のインストール時に上書きされる。
touch ${SYSROOT}/usr/include/gnu/stubs.h
gcc 2回目 (libgcc.a)
前回作業時のファイルを消さずにビルドする。 libgcc.soを作ろうとしてエラーになるので-kで無視する。 また、インストール時に-kオプションを使ってもlibgcc.aがインストールされる前に終了してしまったので、-iオプションを使っている。
cd ${WORK}/build_gcc-4.7.0
make -j4 -k all-target-libgcc
make -i install-target-libgcc
glibc 2回目 (libc.so等)
前回作業時のファイルを消さずにビルドする。
cd ${WORK}/build_eglibc-2.13
make -j4
make install_root=${SYSROOT} install
gcc 3回目 (libstdc++等)
前回作業時のファイルを消さずにビルドする。
cd ${WORK}/build_gcc-4.7.0
make -j4
make install
gcc 4回目 (gcc再コンパイル)
ここまでの手順で開発環境を一から作成することができたわけだが、この作成した開発環境ではgcc等一部のプログラムのコンパイルに失敗してしまう。 その理由は、include-fixed/limits.hの中身がglibcのlimits.hが存在する場合としない場合で異なるためのようだ。 再度gccをconfigureからビルドしなおせば、この問題は解決できる。
参考URL
SDカードの初期化方法
SDカード初期化は、
- fdiskでブート用のパーティションとシステム用のパーティションを作成
- ブート用のパーティションをFATで初期化
- システム用のパーティションをext3で初期化
の手順で行う。
sudo /sbin/fdisk <デバイス名 (/dev/sdf等)>
sudo /sbin/mkfs.msdos -c -F 32 -n boot <デバイス名>1
sudo /sbin/mkfs.ext3 -c <デバイス名>2
fdiskでパーティションを作成するとき、必ず、ブート用のパーティションにブート可能フラグをつけ、さらに領域のシステムタイプを「W95 FAT32 (LBA)」に設定する。ヘッド数やセクタ数も決まった値を使用しなくてはいけない模様。
fdiskの実行例
警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを 強く推奨します。 and change display units to sectors (command 'u'). コマンド (m でヘルプ): p ディスク /dev/sdf: 8068 MB, 8068792320 バイト # SDカードのバイト数 ヘッド 249, セクタ 36, シリンダ 1758 Units = シリンダ数 of 8964 * 512 = 4589568 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 1 1759 7875584 b W95 FAT32 コマンド (m でヘルプ): d # 現在あるパーティションを全て削除するまでdコマンドを実行する 選択した領域 1 コマンド (m でヘルプ): x 上級者コマンド (m でヘルプ): h ヘッド数 (1-256, 初期値 249): 255 上級者コマンド (m でヘルプ): s セクタ数 (1-63, 初期値 36): 63 警告: DOS 互換のためのセクタオフセットを設定します 上級者コマンド (m でヘルプ): c シリンダ数 (1-1048576, 初期値 1758): 980 # SDカードのバイト数 / (512 * 255 * 63) (切り捨て)を入力する 上級者コマンド (m でヘルプ): r コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本パーティション (1-4) p パーティション番号 (1-4): 1 最初 シリンダ (1-980, 初期値 1): # なにも入力しないでデフォルト値を使用 初期値 1 を使います Last シリンダ, +シリンダ数 or +size{K,M,G} (1-980, 初期値 980): 9 コマンド (m でヘルプ): t 選択した領域 1 16進数コード (L コマンドでコードリスト表示): c 領域のシステムタイプを 1 から c (W95 FAT32 (LBA)) に変更しました コマンド (m でヘルプ): a パーティション番号 (1-4): 1 コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本パーティション (1-4) p パーティション番号 (1-4): 2 最初 シリンダ (10-980, 初期値 10): # なにも入力しないでデフォルト値を使用 初期値 10 を使います Last シリンダ, +シリンダ数 or +size{K,M,G} (10-980, 初期値 980): # なにも入力しないでデフォルト値を使用 初期値 980 を使います コマンド (m でヘルプ): w パーティションテーブルは変更されました! ioctl() を呼び出してパーティションテーブルを再読込みします。 警告: DOS 6.x パーティションを作成、または変更してしまった場合は、 fdisk マニュアルの追加情報ページを参照してください。 ディスクを同期しています。
上の例でブート用のパーティションが512 * 255 * 63 * 9 = 70Mバイトで、残りをシステム用のパーティションとしている。
u-bootのコンパイル
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
git clone git://gitorious.org/pandaboard/u-boot-mainline.git u-boot
cd u-boot
git checkout --track -b working origin/v2011.06-panda
make omap4_panda_config
make -j4
u-boot.binという名前のファイルを後でSDカードにインストールする。
boot.scrの作成
boot.scriptに以下の例のような内容のファイルを作成し、
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n ./boot.script -d ./boot.script ./boot.scr
mkimageコマンドはubuntuの場合、以下のコマンドでインストールできる。
sudo apt-get install uboot-mkimage
boot.scriptの例
fatload mmc 0:1 0x80000000 uImage fatload mmc 0:1 0x81600000 uInitrd setenv bootargs 'console=tty0 console=ttyO2,115200n8 vram=32M mem=456M@0x80000000 mem=512M@0xA0000000 root=/dev/mmcblk0p2' bootm 0x80000000 0x81600000
x-loaderのコンパイル
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
git clone git://gitorious.org/x-loader/x-loader.git x-loader
cd x-loader
git checkout --track -b working v1.5.1
make omap4430panda_config
make -j4 ift
MLOという名前のファイルを後でSDカードにインストールする。
Linuxカーネルのコンパイル
ツールチェイン構築の際に、Linuxのソースのダウンロードとコンフィグファイルの作成は済んでいるはず。 以下のコマンドでカーネル本体とモジュールをコンパイルする。
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make -j4 uImage
make -j4 modules
make INSTALL_MOD_PATH=install_path modules_install
make INSTALL_MOD_PATH=install_path firmware_install
Linuxカーネル本体は、arch/arm/boot/uImageに作成される。
初期RAMディスク(uInitrd)の作成
initramfsという名前のディレクトリを作成し、その中に初期RAMディスクに入れたいファイルをコピーする。 次に以下のコマンドを実行する。
cd ./initramfs
find . | cpio -o -H newc | gzip > ../initrd.img.gz
cd ../
mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d ./initrd.img.gz ./uInitrd
SDカードにブートローダとカーネルをインストール
SDカードの初期化方法 で初期化したブートパーティションをマウントし、MLO・u-boot.bin・boot.scr・uImage・uInitrdをコピーする。 このとき、必ず、MLOを一番最初にコピーする。
無線LANの使い方
準備
まず、 こちらのページ を参考にbusyboxなど必要なコマンドをインストールしておく。
次に、無線LANのファームウェアをインストールする。 ファームウェアを次のコマンドで入手することができる。
git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
linux-firmwareディレクトリ以下のti-connectivityディレクトリをSDカードの/lib/firmwareにコピーする。
また、busyboxに含まれるmdevというコマンドを使用するために、initの初期化スクリプト(/etc/init.d/rcS等)に次のコードを追加する。
echo /sbin/mdev > /proc/sys/kernel/hotplug
ドライバのインストールと無線LANインターフェースの起動
ubuntuのカーネルをデフォルトの設定でコンパイルした場合、無線LANモジュールのドライバはモジュールとしてコンパイルされているので、wl12xxとwl12xx_sdioという名前の2つのモジュールをインストールする必要がある。 modprobeコマンドはモジュールの依存性を検出して依存するモジュールを自動的にインストールしてくれるので、wl12xx_sdioをインストールするだけで、wl12xxも自動的にインストールされる。
/sbin/modprobe wl12xx_sdio
これで無線LANが認識できるようになっているので、ifconfigで確認する。
/sbin/ifconfig -a
このコマンドを実行した時に、wlan0が表示されていればOK。引き続きifconfigコマンドを使ってwlan0を起動する。
/sbin/ifconfig wlan0 up
このとき、mdevの設定をしていないと無線LANチップのファームウェアが見つからずエラーとなる。
WEPを使う場合
事前に こちらのページ を参考にWireless Toolsをインストールしておく。
Wireless Toolsに含まれるiwlistコマンドを使って、アクセスポイントの検索を行う。
/usr/sbin/iwlist wlan0 scan | grep ESSID | sort
アクセスポイントがきちんと認識されていることを確認したら、iwconfigコマンドを使ってESSIDとWEBキーを指定する。
iwconfig wlan0 essid your-essid key s:your-wepkey
これで無線LANが使用可能になっているので、後はudhcpクライアント等を利用してネットワーク設定を行う。
/sbin/udhcpc -i wlan0
WPA・WPA2を使う場合
事前に こちらのページ を参考にWPA Supplicantをインストールしておく。
また、下のコマンドを実行して作成したwpa_supplicant.confをWPA Supplicantのソースディレクトリのexamplesを参考に編集し、SDカードの/etc/wpa_supplicant.confにコピーしておく。
wpa_passphrase [SSID] [パスフレーズ] > wpa_supplicant.conf
pandaboardで、下のコマンドでwpa_supplicantデーモンを起動する。
/usr/sbin/wpa_supplicant -Dwext -iwlan0 -P/var/run/wpa_supplicant.pid -c/etc/wpa_supplicant.conf -B
これで無線LANが使用可能になっているので、後はudhcpクライアント等を利用してネットワーク設定を行う。
/sbin/udhcpc -i wlan0