OpenOCD + JTAG を使って MacBook から SheevaPlug の u-boot を書き換える

5月 17, 2009

前のエントリでは u-boot の機能を使って u-boot 自身の置き換えを行った。この方法以外にも SheevaPlug では JTAG 経由で u-boot を書き換えることができる。これを行うためには OpenOCD というソフトを使う。
OpenOCD をコンパイルするために、まず http://www.ftdichip.com/Drivers/D2XX.htm から Mac OS X 用の FTDI ドライバをダウンロードする。この時点のバージョンは 0.1.6 だった。インストールの方法は dmg ファイルの中の ReadMe に書かれているのでこれを参考にすれば良い (下記、ディレクトリの移動などは省略している):

# cp libftd2xx.0.1.6.dylib /usr/local/lib/
# ln -sf /usr/local/lib/libftd2xx.0.1.6.dylib /usr/local/lib/libftd2xx.dylib
# cp ftd2xx.h /usr/local/include/
# cp WinTypes.h /usr/local/include/

openocd-0.1.0.tar.gz には SheevaPlug 用の config が入っていないので、SVN リポジトリから OpenOCD の最新版を取ってくる必要がある:

$ svn co svn://svn.berlios.de/openocd/trunk

Revision 1800 のソースを使用した。
svn のログや OpenOCD のメーリングリストを見ると Mac OS X でコンパイルする上での問題点の報告と修正が頻繁に行われているようだ。コンパイルエラーが出るようであればメーリングリストで状況を確認した方が良さそう。

OpenOCD のコンパイル:

$ ./bootstrap
$ ./configure –enable-ft2232_ftd2xx
$ make
$ sudo make -i install

Info の作成でエラーが出ていたが、とりあえず必要なさそうなので放っておくことにする。

ここで試しに OpenOCD を動かしてみるが、”Error: unable to open ftdi device: 3″ が表示されうまく動かない。FTDI ドライバの Knowledgebase を探ってみるとシリアルドライバをアンインストールせよとあるので試してみる。ただし、シリアルドライバは後々使うので消してしまうのではなくてモジュールをアンロードする方法を取ることにした:

# kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext

再度モジュールをロードするには以下のコマンドを入力すれば良い:

# kextload /System/Library/Extensions/FTDIUSBSerialDriver.kext

このようにモジュールをアンロードすれば一応動いた。

置き換えたい u-boot イメージファイルを uboot.bin という名前にする。このファイルがあるディレクトリで以下を実行する:

$ sudo openocd -f /usr/local/lib/openocd/board/sheevaplug.cfg -c init -c sheevaplug_reflash_uboot

失敗したようだったらもう一度同じコマンドを投入する。
書き換えが完了すると以下のメッセージが表示される:

NAND flash device ‘NAND 512MiB 3,3V 8-bit’ found
successfully erased blocks 0 to 4 on NAND flash device ‘NAND 512MiB 3,3V 8-bit’
wrote file uboot.bin to NAND flash 0 up to offset 0x00073000 in 89.607658s

シリアルコンソールから u-boot のバージョンを確認して、置き換えたものになっていたら成功。

OpenOCD のセットアップについては PlugWiki の Setting Up OpenOCD Under Linux も参考になるかも。

これで SheevaPlug をカスタマイズするために知っておいた方が良さそうな内容は大体試すことができたかな。

広告

SD カードから SheevaPlug を起動する

5月 13, 2009

SheevaPlug の内蔵 NAND は 512 MB しかない。apt-get でさまざまなアプリケーションをインストールするとさすがに容量が足りなくなってくる。そこで SDIO に SD カードを接続し、SD から SheevaPlug を起動することを試してみる。
SD カードからブートできるようになると、SD カードの入れ替えだけで OS を切り替えることができるようになる。VMware のイメージファイルを交換するような感じ。これはかなり便利。

具体的なやり方については以下を参考にした:
http://openplug.org/plugforum/index.php?topic=183.0

SD カードには TS4GSDHC6 を使用した。

SD から起動するためには上記で提供されている patch (sd.tgz) を u-boot に適用し再コンパイルして置き換える必要がある。

まず SheevaPlug_U-Boot.zip を http://www.marvell.com/products/embedded_processors/developer/kirkwood/sheevaplug.jsp から落としてくる。

フォーラムに書かれているやり方を参考に u-boot をコンバイルする:

– u-boot-1.1.4.tar.bz2 を展開。それを u-boot-3.4.16.zip で上書きする。
– sd.tgz を u-boot のディレクトリ直下で解凍。
– include/configs/mv_hw.h を修正:

//#if defined(MV_88F6183) || defined(MV_88F6183L)
#if 1
#define CONFIG_MMC
#define CFG_MMC_BASE 0xF0000000
#endif

– Makefile を修正:
@[ -z “$(findstring rd88f6281Sheevaplug_config,$(RULE))” ] ||
{ echo “MV_FLAGS += -DRD_88F6281A_SHEEVA_PLUG” >> include/config.mk;
echo “MV_IMAGE_FLAGS = -DMV_SEC_256K” >> include/config.mk;
echo “MV_IMAGE_FLAGS += -DMV_BOOTSIZE_16M” >> include/config.mk;
echo “MV_IMAGE_FLAGS += -DMV_LARGE_PAGE” >> include/config.mk;
echo “MV_IMAGE_FLAGS += -DMV_MMC” >> include/config.mk;
echo “MV_FLAGS += -DMV_BOOTROM” >> include/config.mk;
echo “MV_DDR_FREQ = 400db” >> include/config.mk;
cp board/mv_feroceon/config_kw/u-boot-sec256k.lds board/mv_feroceon/config_kw/u-boot.lds;
echo “** SHEEVA PLUG** config ” ;
}
– コンパイル:
$ make rd88f6281Sheevaplug_config NBOOT=1
$ make clean
$ make

u-boot-rd88f6281Sheevaplug_400db_nand.bin というファイルが新しく作成される。u-boot を tftpboot 経由で書き換えるために u-boot-rd88f6281Sheevaplug_400db_nand.bin を /tftpboot/ にコピーしておく。

bubt コマンドを使って u-boot を書き換える:

Marvell>> bubt u-boot.bin
Using egiga0 device
TFTP from server aaa.bbb.ccc.ddd; our IP address is aaa.bbb.ccc.eee
Filename ‘u-boot.bin’.
Load address: 0x2000000
Loading: #################################################################
###########################
done
Bytes transferred = 470836 (72f34 hex)

**Warning**
If U-Boot Endiannes is going to change (LE->BE or BE->LE), Then Env parameters should be overriden..
Override Env parameters? (y/n) y
Erase Env parameters sector 655360…
Erase 0 – 655360 …
Copy to Nand Flash…
done

これで u-boot の書き換えは完了。reset 後、help に mmcinit が増えていることを確認。
以前定義した変数がいくつか書き換えられてしまっていたのでそれらを修正。

次に SD カードに置く rootfs を作成する。ここでは既存の rootfs を再利用することにする。このためにまず nfsroot で起動する。
nfsroot の /dev/ に MMC 用のデバイスファイルが作成されていなかったら作成しておく。

# mknod /dev/mmcblk b 179 0
# mknod /dev/mmcblk1 b 179 1
# mknod /dev/mmcblk2 b 179 2
# mknod /dev/mmcblk3 b 179 3

SD カードのパーティションを適当に切る:

Device Boot Start End Blocks Id System
/dev/mmcblk1 1 3201 102424 83 Linux
/dev/mmcblk2 3202 118402 3686432 83 Linux
/dev/mmcblk3 118403 124928 208832 82 Linux swap

上から /boot 用、/ 用、swap 用にした。boot 用と / 用は ext3 でフォーマットしておく。swap 領域の初期化も行っておく。

今まで使っていた rootfs をマウントして、これを SD カードにコピーする:

# mount /dev/mmcblk2 /mnt/
# mount -t jffs2 /dev/mtdblock2 /mnt1/
# cd /mnt1
# cp -a * /mnt/

fstab を編集:

# vi /mnt/etc/fstab

tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
/proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
varrun /var/run tmpfs rw,nosuid,mode=0755 0 0
varlock /var/lock tmpfs rw,noexec,nosuid,nodev,mode=1777 0 0
udev /dev tmpfs rw,mode=0755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
#rootfs / rootfs rw 0 0
/dev/mmcblk0p1 /boot ext3 rw 0 0
/dev/mmcblk0p2 / ext3 rw 0 0
/dev/mmcblk0p3 swap swap defaults 0 0

カーネルイメージを /boot 領域にコピーしておく。

u-boot のプロンプトに入り、SD カードが使えそうか確認:

Marvell>> mmcinit
Marvell>> ext2ls mmc 0:1

SD カードから起動するために u-boot のパラメータを設定する:

Marvell>> set bootargs ‘console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs)rw root=/dev/mmcblk0p2 rootfstype=ext3 rootdelay=3’
Marvell>> set bootcmd ‘mmcinit; ext2load mmc 0:1 0x800000 /uImage-2.6.30-rc5-090510; bootm 0x800000’
Marvell>> saveenv
Marvell>> reset

起動がかなり速くなった。内蔵 NAND の場合、カーネルイメージのロードに時間がかかっていたが、これがあっという間に終わる。なかなか良い感じだ。
次は Ubuntu 以外の OS をインストールした SD カードを作成してみよう。

http://openplug.org/ のフォーラムや Wiki の情報がかなり充実してきている。これからも見逃すことができなさそうだ。

SheevaPlug のカーネルを 2.6.30-rc5 にする

5月 10, 2009

前のエントリに書いた通り SheevaPlug の SDHC の Read/Write 性能が非常に遅い。カーネルのバージョンを上げることで解消できるとの話があり、カーネルバージョンアップを試してみることにした。
Linux kernel 2.6.30-rc1 から SheevaPlug を使うことができる。今回は kernel.org で公開されている最新版 2.6.30-rc5 を使うことにした。

カーネルのコンパイル方法については以下にまとめられている。基本的にはこれに従ってコンパイルすれば良い:

http://plugcomputer.org/plugwiki/index.php/Compiling_Linux_Kernel_for_the_Plug_Computer

$ make ARCH=arm kirkwood_defconfig
$ make ARCH=arm menuconfig

SDIO 関係の patch を当てておく:
$ patch -p1  < mvsdio.patch

この patch は現時点で以下から手に入る:

http://svn.nslu2-linux.org/svnroot/optware/trunk/sources/kernel-modules/kirkwood/mvsdio.patch

せっかくなので ext4 や btrfs など色々と入れてみた。カーネル本体が大きくなりすぎると uImage 領域のパーティションを拡張する必要が出てくるのでモジュールを多めにした。

$ make ARCH=arm CROSS_COMPILE=~/SheevaPlug_tools/LinuxHost/gcc/bin/arm-none-linux-gnueabi- uImage
$ make ARCH=arm CROSS_COMPILE=~/SheevaPlug_tools/LinuxHost/gcc/bin/arm-none-linux-gnueabi- modules

ARCH や CROSS_COMPILE を指定するところが重要。

u-boot で以下の設定をする:

Marvell>> setenv mainlineLinux yes

SheevaPlug の標準カーネルで立ち上げるときにこれが yes になっていると立ち上がらないので注意。

Marvell>> setenv arcNumber 2097
Marvell>> saveenv
Marvell>> reset

添付のカーネルでは mtdparts で nand_mtd を使ってパーティションを指定していたが、2.6.30 では orion_nand になっているので注意。rootfstype も指定しておく。u-boot のコマンドラインで変更:

Marvell>> set bootargs ‘console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs)rw root=/dev/mtdblock1 rootfstype=jffs2’
Marvell>> saveenv
Marvell>> reset

uname -m の結果が armv5tel になっている。

SDIO の性能が改善されたか確認してみた。
オリジナルのカーネルから 2.6.30 に変更することで、シーケンシャル write 6.9 MB/s (変更前は 600 KB/s)、シーケンシャル read 19.1 MB/s (変更前は 9.4 MB/s) となった。TS4GSDHC6 の性能から考えて問題なさそう。SheevaPlug の標準カーネルはやはり SDIO 関係に問題を抱えているようだ。
SheevaPlug を手に入れたらカーネル 2.6.30-rc1 以降にした方が良さそう。