Sheeva Plug の U-Boot に関するページです。

U-Boot

Sheeva Plug では、ブートローダに U-Boot が採用されている。
購入時の U-Boot の環境変数一覧。特に、Gigabit Ether の MACアドレスが ethaddr に記憶されているので、これだけでもメモっておいた方がよい。

Marvell>> printenv
baudrate=115200
loads_echo=0
rootpath=/mnt/ARM_FS/
netmask=255.255.0.0
console=console=ttyS0,115200
CASset=min
MALLOC_len=1
ethprime=egiga0
bootargs_root=root=/dev/mtdblock2 ro
ethmtu=1500
usb0Mode=host
nandEcc=1bit
ethact=egiga0
serverip=10.10.0.2
ipaddr=10.10.0.1
cesvcid=ULULULULULULPPULULULULULDA
bootargs_end=:::DB88FXX81:eth0:none
image_name=uImage
standalone=fsload 0x2000000 $(image_name);setenv bootargs $(console) root=/dev/mtdblock0 rw ip=$(ipaddr):$(serverip)$(bootargs_end) $(mvPhoneConfig); bootm 0x2000000;
mvPhoneConfig=mv_phone_config=dev0:fxs,dev1:fxs
mvNetConfig=mv_net_config=(00:11:88:0f:62:81,0:1:2:3),mtu=1500
yuk_ethaddr=00:00:00:EE:51:81
netretry=no
rcvrip=169.254.100.100
loadaddr=0x02000000
autoload=no
ethaddr=00:50:43:xx:xx:xx
run_diag=no
bootargs=console=ttyS0,115200 mtdparts=nand_mtd:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 rw ip=10.4.50.4:10.4.50.5:10.4.50.5:255.255.255.0:DB88FXX81:eth0:none
bootcmd=nand read.e 0x800000 0x100000 0x400000; bootm 0x800000
stdin=serial
stdout=serial
stderr=serial
mainlineLinux=no
enaMonExt=no
enaCpuStream=no
enaWrAllo=no
pexMode=RC
disL2Cache=no
setL2CacheWT=yes
disL2Prefetch=yes
enaICPref=yes
enaDCPref=yes
sata_dma_mode=yes
netbsd_en=no
vxworks_en=no
bootdelay=3
disaMvPnp=no
enaAutoRecovery=yes

時計の設定

購入時には時計が適当な時間になっているので、起動させる前に正しい時刻に設定しておいた方がよい。

Marvell>> date 0802035809

時刻はUTC(日本標準時から9時間引いた値)を入力する。この例では、2009/08/02 12:58 JST = 03:59 UTC である。
一度も日付時刻設定をしていないと、2022年とかおかしな日付になってしまうことがあるので注意。

U-Boot の更新

2009 Mar. 19 版にはバグがあり、Ubuntu Weekly Recipe:第70回 GW特別企画・電源プラグ型コンピューターSheevaPlugの使い方(2):インストール編|gihyo.jp … 技術評論社によると、再起動を繰り返しているとuImageのCRCが合わなくなる(=起動不能になる)・RTCを記録してくれない・まれにuBootが起動してこない,といった問題を抱えているらしい。7月中旬に発注し、8月下旬に入荷した奴も、このバグ持ち U-Boot だった。

DENX 版

SheevaPlug/U-Boot/DENXへ。

TFTP を用いたやり方

TFTP サーバとシリアルコンソールを用意する必要があるが、Sheeva Plug が U-Boot のところまでたどり着くのであれば、こちらの方が楽。

最新版 U-Boot バイナリの入手

www.plugcomputer.orgより、

  • Resources
    • Downloads
      • SheevaPlug Software & Design Information - Revision 1.2
        • SheevaPlug_U-Boot1.2

とたどり、fileSheevaPlug_U-Boot1.2.zip をダウンロードする。

SheevaPlug_U-Boot1.2.zip から fileu-boot-rd88f6281Sheevaplug_400db_nand.bin を取り出し、別途用意した TFTP サーバにアップロードする。

シリアルコンソールを用いた U-Boot 上での作業

Sheeva Plug と TFTPサーバのIPアドレスを指定した後に、TFTPで新しい U-Boot のバイナリファイルをダウンロードして、NAND Flash に書き込む。

  • まず、念のため U-Boot の現在の環境変数をどこかに記録しておく。
    Marvell>> printenv
  • 次に、Sheeva Plug と TFTPサーバのIPアドレスを指定する。
    Marvell>> set ipaddr 192.168.aa.bbSheevaPlugのIPアドレス
    Marvell>> set serverip 192.168.aa.cc	← TFTPサーバのIPアドレス
    Marvell>> set netmask 255.255.255.0
    Marvell>> saveenv
  • bubt コマンドで TFTP を用いて新しい U-Boot のバイナリファイルをダウンロードして、NAND Flash に書き込む。
    Marvell>> bubt u-boot-rd88f6281Sheevaplug_400db_nand.bin
    Override Env parameters? (y/n) n  ←nを選択した方が無難
  • リセットして、正常に起動するか確認する。 まずリセット。
    Marvell>> reset
    U-Boot が起動したら、バージョンが新しくなっていることを確認した後、起動する。
    Marvell>> version
    
    U-Boot 1.1.4 (Apr  9 2009 - 12:23:12) Marvell version: 3.4.16
    Marvell>> boot
  • もしも、U-Bootの更新時に環境変数を上書きするを選択した場合
    NANDから起動するように、bootcmd と bootargs の2つの環境変数を変更する。
    Marvell>> setenv bootcmd 'nand read.e 0x800000 0x100000 0x400000; bootm 0x800000'
    Marvell>> setenv bootargs console='ttyS0,115200 mtdparts=nand_mtd:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 rw'
    また、Gigabit Ethernetの MACアドレスも変わっているはずなので、これを元の値に戻しておく。
    Marvell>> setenv ethaddr 00:50:43:xx:xx:xx
    Marvell>> saveenv
    参考までに、U-Boot更新後の環境変数一覧。NANDからの起動ではなく、TFTPブートして NFSROOT するようになっている。
    baudrate=115200
    loads_echo=0
    ipaddr=10.4.50.165
    serverip=10.4.50.5
    rootpath=/mnt/ARM_FS/
    netmask=255.255.255.0
    stdin=serial
    stdout=serial
    stderr=serial
    console=console=ttyS0,115200 mtdparts=nand_mtd:0x100000@0(uboot)ro,0x0@0x100000(uImage),0x1ff00000@0x100000(rootfs)rw
    mainlineLinux=no
    CASset=min
    enaMonExt=no
    enaCpuStream=no
    enaWrAllo=no
    pexMode=RC
    disL2Cache=no
    setL2CacheWT=yes
    disL2Prefetch=yes
    enaICPref=yes
    enaDCPref=yes
    sata_dma_mode=yes
    MALLOC_len=1
    ethprime=egiga0
    netbsd_en=no
    vxworks_en=no
    bootargs_root=root=/dev/nfs rw
    bootargs_end=:::DB88FXX81:eth0:none
    image_name=uImage
    bootcmd=tftpboot 0x2000000 $(image_name);setenv bootargs $(console) $(bootargs_root) nfsroot=$(serverip):$(rootpath) ip=$(ipaddr):$(serverip)$(bootargs_end) $(mvNetConfig) $(mvPhoneConfig);  bootm 0x2000000; 
    standalone=fsload 0x2000000 $(image_name);setenv bootargs $(console) root=/dev/mtdblock0 rw ip=$(ipaddr):$(serverip)$(bootargs_end) $(mvPhoneConfig); bootm 0x2000000;
    bootdelay=3
    disaMvPnp=no
    ethaddr=00:50:43:yy:yy:yy
    ethmtu=1500
    mvPhoneConfig=mv_phone_config=dev0:fxs,dev1:fxs
    mvNetConfig=mv_net_config=(00:11:88:0f:62:81,0:1:2:3),mtu=1500
    usb0Mode=host
    yuk_ethaddr=00:00:00:EE:51:81
    nandEcc=1bit
    netretry=no
    rcvrip=169.254.100.100
    loadaddr=0x02000000
    autoload=no
    enaAutoRecovery=yes
    ethact=egiga0
    bootargs=console=ttyS0,115200 mtdparts=nand_mtd:0x100000@0(uboot)ro,0x0@0x100000(uImage),0x1ff00000@0x100000(rootfs)rw root=/dev/nfs rw nfsroot=10.4.50.5:/mnt/ARM_FS/ ip=10.4.50.165:10.4.50.5:::DB88FXX81:eth0:none mv_net_config=(00:11:88:0f:62:81,0:1:2:3),mtu=1500 mv_phone_config=dev0:fxs,dev1:fxs
    

参考

JTAG を用いたやり方

2.6.30 以降のカーネルを起動する。

いくつか環境変数を変更・新設する必要がある。

Marvell>> setenv mainlineLinux yes
Marvell>> setenv arcNumber 2097
Marvell>> setenv cesvcid ULULULULULULPPULULULULULDA
Marvell>> setenv console 'ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw'

SDカードからの起動

自前カーネルやディストリビューションをテストする際には、毎回 NAND に書き込むのは怖いので、SDカードから起動できるようにすると便利である。

SheevaPlug/SDIOboot

参考:

TFTP + NFS root

SheevaPlug/NFSroot

USB からの起動

SheevaPlug/USBboot

初期化

いろいろと設定を変えていたら、U-Boot までは立ち上がるものの、OS の起動に失敗するようになった。作業をしていたのが深夜で、いちいち設定を手作業で戻すのが面倒だったので、初期化してみた。

Marvell>> resetenv
Marvell>> reset

再起動後に、自分の環境に合わせて環境変数を設定する。

Marvell>> setenv bootcmd 'nand read.e 0x800000 0x100000 0x400000; bootm 0x800000'
Marvell>> setenv bootargs 'console=ttyS0,115200 mtdparts=nand_mtd:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 rw ip=10.4.50.4:10.4.50.5:10.4.50.5:255.255.255.0:DB88FXX81:eth0:none'
Marvell>> setenv ethaddr 00:50:43:xx:xx:xx
Marvell>> setenv run_diag no		←これは必要なかった。(SDブート対応に更新していたせいか?)
Marvell>> saveenv

マルチブート

今まで見てきたように、Sheeva Plug では、NAND Flash, SDカード, TFTPを用いた NFS root, USBブートなど、様々な方法でブート可能である。それらは、すべて U-Boot の環境変数を変更することにより選択するのだが、毎回大幅に変更していたのでは大変である。そこで、各ブート法に関する基本的な設定をあらかじめ別々の環境変数に設定しておき、「run hogehoge」で選択すると便利である。

  • 共通
    Marvell>> setenv console_base console='ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw'console変数はリブートすると勝手に初期化されるので、別変数を設定
    	 一度設定されていれば、不要
    Marvell>> setenv console console='ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs)'
    	(2009-12-24 Marvell U-Boot 3.4.23 では上記不具合は解消されていたので、console_base を console に置き換えてよい。)
    Marvell>> setenv loadaddr 0x0800000
    Marvell>> setenv image_name uImage
  • NAND からの起動
    Marvell>> setenv bootargs_nand 'root=/dev/mtdblock1 rw rootfstype=jffs2'
    Marvell>> setenv bootnand 'nand read.e $(loadaddr)  0x100000 0x400000'
    Marvell>> setenv bootcmd_nand 'setenv bootargs $(console_base) $(console) $(bootargs_nand); run bootnand; bootm $(loadaddr)'
  • SD カードからの起動
    以下の例では、/dev/mmcblk0p1 を /boot に、/dev/mmcblk0p3 を / パーティションにマウントする。
    # fdisk -l /dev/mmcblk0
    
    Disk /dev/mmcblk0: 4119 MB, 4119330816 bytes
    92 heads, 27 sectors/track, 3238 cylinders
    Units = cylinders of 2484 * 512 = 1271808 bytes
    Disk identifier: 0x00000000
    
            Device Boot      Start         End      Blocks   Id  System
    /dev/mmcblk0p1               1         423      525352+  83  Linux
    /dev/mmcblk0p2             424         846      525366   82  Linux swap / Solaris
    /dev/mmcblk0p3             847        3238     2970864   83  Linux
    
    / パーティションが /dev/mmcblk0p3 になるので、bootargs_sd で root デバイスを指定する。
    Marvell>> setenv bootargs_sd 'root=/dev/mmcblk0p3 rw rootfstype=ext2 rootdelay=3'
    Marvell>> setenv bootsd 'mmcinit; ext2load mmc 0:1 $(loadaddr) /$(image_name)'
    	←$(image_name) の前に / を付けないとカーネルを探してくれないので注意
    Marvell>> setenv bootcmd_sd 'setenv bootargs  $(console_base) $(console) $(bootargs_sd); run bootsd; bootm $(loadaddr)'
  • USB からの起動
    Marvell>> setenv bootargs_usb 'root=/dev/sda1 rw rootfstype=ext3 rootdelay=10'
    Marvell>> setenv bootusb 'usb start; ext2load usb 0:1 $(loadaddr) /boot/$(image_name)'
    Marvell>> setenv bootcmd_usb 'setenv bootargs  $(console_base) $(console) $(bootargs_usb); run bootusb; bootm $(loadaddr)'
  • TFTP を利用したNFS root
    Marvell>> setenv ipaddr aaa.bbb.ccc.ddd			Sheeva Plug のIPアドレス
    Marvell>> setenv serverip aaa.bbb.ccc.eee			TFTPサーバのIPアドレス
    Marvell>> setenv rootpath '/nfs/sheevaplug/lenny'		rootfsイメージを展開したディレクトリ
    Marvell>> setenv bootargs_nfs 'root=/dev/nfs rw'
    Marvell>> setenv bootnfs 'tftpboot $(loadaddr) $(image_name)'
    Marvell>> setenv bootcmd_nfs 'setenv bootargs  $(console_base) $(console) $(bootargs_nfs) nfsroot=$(serverip):$(rootpath) ip=$(ipaddr):$(serverip)$(bootargs_end); run bootnfs; bootm $(loadaddr)'
  • マルチブートの設定
    Marvell>> setenv bootcmd 'run bootcmd_usb; run bootcmd_sd; run bootcmd_nfs; run bootcmd_nand'
    Marvell>> saveenv
    Marvell>> reset
    上記の設定をすると、USB → SDカード → TFTP + NFS → NAND Flash の順にサーチして、カーネルが見つかったデバイスからブートするようになる。

U-Bootのビルド

SheevaPlug の U-Boot は 1.1.4 と極めて古いバージョンをベースに開発されているが、SDカードからのブートなど独自に追加されて機能もある。U-Boot の開発も続けられているので、Forumを適宜参照しながら、自前でビルドするのもおもしろい。

ソースコードとパッチのダウンロード

SheevaPlug の U-Boot は、version 1.1.4 のソースコードとそれに対するパッチの形で提供されている。
1.1.4のソースコードは、www.plugcomputer.orgのダウンロードから SheevaPlug_U-Boot1.2 の zip ファイルをダウンロードして解凍すると、U-Boot - Sources ディレクトリに u-boot-1.1.4.tar.bz2 が含まれている。
1.1.4へのパッチも同様にwww.plugcomputer.orgのダウンロードの U-Boot カテゴリからダウンロードできる。2010-01-05現在、u-boot-3.4.27.zip が公開されている。
ただし、最新版に更新される度に旧バージョンは削除されてしまうようた。度々最新版にも不具合が見つかっているので、一度ダウンロードしたものは保存しておいた方がよい。

ソースコードの展開とパッチ当て

3.4.27の場合

$ cd /workdir
$ tar jxvf u-boot-1.1.4.tar.bz2
$ mv u-boot-1.1.4 u-boot-3.4.27	← zipファイルで上書きするために、ディレクトリ名を変更しておく。
$ unzip -o u-boot-3.4.27.zip
$ cd u-boot-3.4.27
$ patch -p 1 < ../pathch-3.4.27-pingtoo-01

ビルド

クロスコンパイルの場合

クロスコンパイラのバイナリへ PATH を通しておく。以下の例では、/usr/cross/sheevaplug/bin ディレクトリに arm-none-linux-gnueabi-* という名前のクロスコンパイラ用のバイナリがある。

$ export PATH=/usr/cross/sheevaplug/bin:$PATH
$ make CROSS_COMPILE=arm-none-linux-gnueabi- mrproper
$ make CROSS_COMPILE=arm-none-linux-gnueabi- rd88f6281Sheevaplug_config LE=1 NBOOT=1
$ make CROSS_COMPILE=arm-none-linux-gnueabi- all

u-boot-rd88f6281Sheevaplug_400db_nand.bin が NANDフラッシュの書き込み用。

セルフコンパイルの場合

Makefile 中に デフォルトで CROSS_COMPILE が arm-linux- と定義されているので、これを無効にするだけ。

$ make CROSS_COMPILE="" mrproper
$ make CROSS_COMPILE="" rd88f6281Sheevaplug_config LE=1 NBOOT=1
$ make CROSS_COMPILE="" all 

RAM版 U-Boot

今までの方法では、出来上がった u-boot-rd88f6281Sheevaplug_400db_nand.bin を NANDフラッシュに書き込みしなければならない。開発中のものを頻繁にフラッシュに書き込みたくないので、ここにあるpingtoo氏の書き込みにしたがってが書かれた方法で RAM版 U-Boot を作成する。

$ make CROSS_COMPILE="" mrproper
$ make CROSS_COMPILE="" rd88f6281Sheevaplug_config LE=1 NBOOT=1

board/mv_feroceon/config_kw/config.mk を以下のように変更する。

TEXT_BASE = 0x00600000
          ↓
TEXT_BASE = 0x01600000

ビルドする。

$ make CROSS_COMPILE="" -s 

できあがった u-boot.bin を TFTPサーバに転送する。
今、/var/lib/tftpboot/SheevaPlug/ にあるとして、SheevaPlugを起動し、U-Bootの画面で以下のようにコマンドを打つ。

Marvell>> tftp 0x01600000 /SheevaPlug/u-boot.bin
Marvell>> go 0x01600000

これで RAMに読み込まれた U-Boot が立ち上がってくる。

各バージョンの状況

3.4.16

SDブートに対応していない。さらに、2009 Mar. 19 版にはバグがあり、Ubuntu Weekly Recipe:第70回 GW特別企画・電源プラグ型コンピューターSheevaPlugの使い方(2):インストール編|gihyo.jp … 技術評論社によると、再起動を繰り返しているとuImageのCRCが合わなくなる(=起動不能になる)・RTCを記録してくれない・まれにuBootが起動してこない,といった問題を抱えているらしい。

3.4.19

SDブートに対応。しかし、再起動すると環境変数 console が初期化されてしまう不具合あり。

3.4.23

ひょっとすると、今のところ一番安定しているかもしれない。

どぶお/SheevaPlugで遊ぼう!/U-Bootをビルドする - BioKids Wikiで公開されている Marvell U-Boot 3.4.23 では、Uncompressing Linux.. done, booting the kernel. と表示した後、いきなりログイン画面になってしまった。
と思っていたが、別のSheevaPlugでは起動のメッセージがシリアルコンソールに表示された。ハードウェアの微妙なリビジョンの違いだろうか? 謎だ。
さらに他のマシンにも 3.4.23 をインストールしたが、起動メッセージは表示された。今のところ、不具合がでたマシンは3台中1台。

3.4.27

VirutualBox 上の Lenny amd64 で SheevaPlug用に公開されているクロスコンパイラを用いて作成したバイナリは、SDカード上の uImage を読み込んだ後、Bad Data CRC と表示してエラーになる。
これは割と有名な問題のようで、plugcomputer.org のフォーラムでもクロスコンパイラの問題ではないかとの指摘があるが、詳細は不明である。

セルフコンパイルしたものでは、このエラーは発生しなかった。

情報


添付ファイル: filepathch-3.4.27-pingtoo-01 720件 [詳細] fileu-boot-3.4.27.zip 821件 [詳細] fileu-boot-3.4.23.zip 796件 [詳細] fileu-boot-3.4.19.zip 392件 [詳細] fileu-boot-rd88f6281Sheevaplug_400db_nand.bin 659件 [詳細] fileSheevaPlug_U-Boot1.2.zip 2508件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-24 (土) 03:44:34 (1794d)