ホーム > ARM >

PandaBoard開発

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からビルドしなおせば、この問題は解決できる。

SDカードの初期化方法

SDカード初期化は、

  1. fdiskでブート用のパーティションとシステム用のパーティションを作成
  2. ブート用のパーティションをFATで初期化
  3. システム用のパーティションを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