Sheeva Plug の NAND Flash に関するページです。

NAND Flash

Sheeva Plug は、512MB の NAND Flash を持ち、U-Boot, uImage, Ubuntu の rootfs が記録されている。

kernel の書き換え

http://sheeva.with-linux.com/sheeva/ で公開されているバイナリを利用する場合

http://sheeva.with-linux.com/sheeva/ ではビルド済みカーネルやモジュールのバイナリが公開されており、README ファイルがインストーラを兼ねているので、インターネットに接続されていれば、簡単にインストールできる。

初期状態の NAND から起動している場合には、設定ファイルの修正や wget のインストールが必要。

# cd workdir
# wget http://sheeva.with-linux.com/sheeva/README-2.6.xx
# chmod a+x README-2.6.xx
  • 2.6.30.7 以降
    README ファイルの実行時に、明示的にNAND Flash への書き込みなのか、/boot ディレクトリへのコピーなのかを指定しなければいけないようになった。もしも、オプションなしで起動した場合、Usage が表示される。
    • /boot ディレクトリに uImage をコピーする場合
      # ./README-2.6.xx --rootkernel 
    • NAND Flash に書き込む場合
      # ./README-2.6.xx --nandkernel
      2.6.30 以降のカーネルに書き換えた場合、U-Boot の環境変数を以下のように書き換える必要あり。
      Marvell>> setenv mainlineLinux yes
      Marvell>> setenv arcNumber 2097
      Marvell>> setenv cesvcid ULULULULULULPPULULULULULDA
      Marvell>> setenv console 'ttyS0,115200mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw'
  • 2.6.30.6
    NAND Flash への書き込みの他に、/boot ディレクトリへのコピーもサポートするようになった。README-2.6.30.6 の実行時に、--rootkernel オプションを付ければ /boot ディレクトリに uImage をコピーする。オプションなしの場合は、NAND Flash へ書き込む。
    • /boot ディレクトリに uImage をコピーする場合
      # ./README-2.6.30.6 --rootkernel 
    • NAND Flash に書き込む場合
      # ./README-2.6.30.6 
  • 2.6.30.5 以前
    NAND Flash への書き込みしかサポートしていないので、単純に README-2.6.30.y を実行すればよい。
    # ./README-2.6.30.y 

コマンドを使って書き込む場合

自前でビルドしたカーネルなど、コマンドを使って NAND Flash に書き込むには、Debian 系の場合、flash_erase や nandwrite コマンドが含まれる mtd-utils パッケージが必要。

# apt-get install mtd-utils

次に、uImage が含まれる MTD パーティションを調べる。

# cat /proc/mtd | grep uImage
mtd1: 00400000 00020000 "uImage"

NAND Flash を消去した後、uImage ファイルを書き込む。

# flash_erase /dev/mtd1 0 0
Erasing 128 Kibyte @ 3e0000 -- 100 % complete 
# nandwrite -pm /dev/mtd1 uImage

参考

UBIFS への変更

SheevaPlug は出荷時に NAND が JFFS2 でフォーマットされているが、OpenRD などでは ubifs が使用されている。Enabling UBIFS - PlugWikiなどによると、UBIFS は JFFS2 に比べてめちゃくちゃ早いらしい。(dd を使った 32MB のダミーファイルの書き込みで 20倍くらい)さらに、特定の箇所への書き込みの集中を回避する wear-leveling 機能(参考URL)も有する。詳しくは、ここを参照のこと。

UBIFS は Linux のカーネル 2.6.27 からメインラインに取り込まれているが、なるべく新しい UBIFS git tree の linux-next branch から最新版を入手してパッチを当てるのが推奨されている。今回は面倒なので、SheevaPlug のカーネルに http://sheeva.with-linux.com/sheeva/ で公開されている kernel-2.6.35.4 を用い、作業のほとんどは VirtualBox 上の Debian Squeeze amd64 上で行った。

UBIFS 対応のカーネルの書き込み

TFTP, SDカードあるいは USB ディスクから UBIFS をサポートするカーネルで起動し、確かにUBIFS がサポートされているかを確かめる。

# cat /proc/filesystems
nodev	sysfs
nodev	rootfs
nodev	bdev
nodev	proc
nodev	tmpfs
nodev	debugfs
nodev	sockfs
nodev	usbfs
nodev	pipefs
nodev	anon_inodefs
nodev	rpc_pipefs
nodev	devpts
	ext3
	ext2
	ext4
	cramfs
nodev	ramfs
	vfat
	msdos
nodev	nfs
nodev	nfs4
nodev	jffs2
	jfs
nodev	mtd_inodefs
nodev	oprofilefs
nodev	ubifs		←これが入っていることを確認する

次に、uImage が含まれる MTD パーティションを調べる。

# cat /proc/mtd | grep uImage
mtd1: 00400000 00020000 "uImage"

例えば、http://sheeva.with-linux.com/sheeva/ で公開されているカーネルで 2010-09-26 現在最新の 2.6.35.4 を利用するのなら、以下の手順で NAND に書き込む。

# wget http://sheeva.with-linux.com/sheeva/2.6.35.4/sheeva-2.6.35.4-uImage
# wget http://sheeva.with-linux.com/sheeva/2.6.35.4/sheeva-2.6.35.4-uImage.md5
# md5sum -c sheeva-2.6.35.4-uImage.md5
sheeva-2.6.35.4-uImage: OK
# flash_eraseall -j /dev/mtd1
# nandwrite -pm /dev/mtd1 sheeva-2.6.35.4-uImage

母艦での作業

SheevaPlug/Debian/Squeezeにしたがって、ルートファイルシステムを tar で固めたものを作成する。

この tar ball にはカーネルモジュールが含まれていないので、tar ball を作業用ディレクトリに展開した後、NAND に書き込んだカーネルと同じバージョンのモジュールを展開する。

# mkdir workdir
# wget http://sheeva.with-linux.com/sheeva/2.6.35.4/sheeva-2.6.35.4-Modules.tar.gz
# wget http://sheeva.with-linux.com/sheeva/2.6.35.4/sheeva-2.6.35.4-Modules.tar.gz.md5
# md5sum -c sheeva-2.6.35.4-Modules.tar.gz.md5 
sheeva-2.6.35.4-Modules.tar.gz: OK
# tar zxvf squeeze_rootfs-NAND.tar.gz -C workdir
# tar zxvf sheeva-2.6.35.4-Modules.tar.gz -C workdir

workdir/etc/fstab が以下のようになっているか確認しておく。

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>                     <d><p>
/dev/root	/		ubifs	defaults,noatime,rw		0  0
tmpfs		/var/run	tmpfs	size=1M,rw,nosuid,mode=0755	0  0
tmpfs		/var/lock	tmpfs	size=1M,rw,noexec,nosuid,nodev,mode=1777 0  0
tmpfs		/tmp		tmpfs	defaults,nosuid,nodev		0  0

イメージファイルを作成する。
(Debian Lenny の mtd-utils には mkfs.ubifs コマンドが含まれないので注意)

# apt-get install mtd-utils
# mkfs.ubifs -v -r workdir -m 2048 -e 129024 -c 4096 -o ubifs.img
# cat > ubi.cfg <<_EOF_
[rootfs-volume]
# mode=ubi
# image=ubifs.img
# vol_id=0
# vol_size=400MiB
# vol_type=dynamic
# vol_name=rootfs
# vol_flags=autoresize
# _EOF_
# ubinize -v -o ubi.img -m 2048 -p 128KiB -s 512 ubi.cfg

ターゲットマシンにイメージファイルを転送し、NAND に書き込む。

書き込み先のデバイス名を確認しておく。

# cat /proc/mtd | grep root
mtd2: 1fb00000 00020000 "root"
</pre> 
UBIFS でフォーマットして、イメージファイルを書き込む。
<pre>
# ubiformat /dev/mtd2 -s 512 -f ubi.img

uboot の環境変数を変更して、NAND から起動する。

uboot の環境変数を以下のように設定する。

setenv bootargs_nand 'console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs'
setenv bootcmd_nand 'setenv bootargs $(bootargs_nand); nand read 0x2000000 0x100000 0x400000; bootm 0x2000000'

起動は run bootcmd_nand で行う。

起動メッセージ

Marvell>> run bootcmd_nand

NAND read: device 0 offset 0x100000, size 0x400000
 4194304 bytes read: OK
## Booting image at 02000000 ...
   Image Name:   Linux-2.6.35.4
   Created:      2010-09-22   4:58:15 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2805180 Bytes =  2.7 MB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
[    0.000000] Linux version 2.6.35.4 (hogehoge@sheeva02) (gcc version 4.3.2 (Debian 4.3.2-1.1) ) #1 PREEMPT Wed Sep 22 13:34:51 JST 2010
[    0.000000] CPU: Feroceon 88FR131 [56251311] revision 1 (ARMv5TE), cr=00053977
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] Machine: Marvell SheevaPlug Reference Board
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 130048
[    0.000000] Kernel command line: console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs
[    0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] Memory: 256MB 256MB = 512MB total
[    0.000000] Memory: 513584k/513584k available, 10704k reserved, 0K highmem
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[    0.000000]     DMA     : 0xffc00000 - 0xffe00000   (   2 MB)
[    0.000000]     vmalloc : 0xe0800000 - 0xfe800000   ( 480 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xe0000000   ( 512 MB)
[    0.000000]     modules : 0xbf000000 - 0xc0000000   (  16 MB)
[    0.000000]       .init : 0xc0008000 - 0xc002d000   ( 148 kB)
[    0.000000]       .text : 0xc002d000 - 0xc0513000   (5016 kB)
[    0.000000]       .data : 0xc0536000 - 0xc05667a0   ( 194 kB)
[    0.000000] SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] Hierarchical RCU implementation.
[    0.000000] 	RCU-based detection of stalled CPUs is disabled.
[    0.000000] 	Verbose stalled-CPUs detection is disabled.
[    0.000000] NR_IRQS:114
[    0.000000] Console: colour dummy device 80x30
[    0.000129] Calibrating delay loop... 1192.75 BogoMIPS (lpj=5963776)
[    0.240057] pid_max: default: 32768 minimum: 301
[    0.240129] Mount-cache hash table entries: 512
[    0.240415] CPU: Testing write buffer coherency: ok
[    0.242723] NET: Registered protocol family 16
[    0.244748] Kirkwood: MV88F6281-A0, TCLK=200000000.
[    0.244762] Feroceon L2: Enabling L2
[    0.244797] Feroceon L2: Cache support initialised.
[    0.258890] bio: create slab <bio-0> at 0
[    0.259400] vgaarb: loaded
[    0.259897] SCSI subsystem initialized
[    0.261383] usbcore: registered new interface driver usbfs
[    0.261640] usbcore: registered new interface driver hub
[    0.261817] usbcore: registered new device driver usb
[    0.263496] cfg80211: Calling CRDA to update world regulatory domain
[    0.263684] Switching to clocksource orion_clocksource
[    0.277663] NET: Registered protocol family 2
[    0.277842] IP route cache hash table entries: 4096 (order: 2, 16384 bytes)
[    0.278476] TCP established hash table entries: 16384 (order: 5, 131072 bytes)
[    0.278829] TCP bind hash table entries: 16384 (order: 4, 65536 bytes)
[    0.279009] TCP: Hash tables configured (established 16384 bind 16384)
[    0.279019] TCP reno registered
[    0.279030] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.279053] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.279182] NET: Registered protocol family 1
[    0.279411] RPC: Registered udp transport module.
[    0.279422] RPC: Registered tcp transport module.
[    0.279430] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.354202] JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[    0.355374] JFS: nTxBlock = 4012, nTxLock = 32099
[    0.356631] msgmni has been set to 1003
[    0.358871] alg: No test for stdrng (krng)
[    0.358918] io scheduler noop registered
[    0.358928] io scheduler deadline registered
[    0.359023] io scheduler cfq registered (default)
[    0.366280] Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled
[    0.367119] serial8250.0: ttyS0 at MMIO 0xf1012000 (irq = 33) is a 16550A
[    0.724848] console [ttyS0] enabled
[    0.736407] brd: module loaded
[    0.743246] loop: module loaded
[    0.748264] NAND device: Manufacturer ID: 0xad, Chip ID: 0xdc (Hynix NAND 512MiB 3,3V 8-bit)
[    0.756790] Scanning device for bad blocks
[    0.815872] Bad eraseblock 1856 at 0x00000e800000
[    0.840006] Bad eraseblock 2512 at 0x000013a00000
[    0.891548] Creating 3 MTD partitions on "orion_nand":
[    0.896726] 0x000000000000-0x000000100000 : "u-boot"
[    0.902846] 0x000000100000-0x000000500000 : "uImage"
[    0.908956] 0x000000500000-0x000020000000 : "root"
[    0.915689] UBI: attaching mtd2 to ubi0
[    0.919549] UBI: physical eraseblock size:   131072 bytes (128 KiB)
[    0.925895] UBI: logical eraseblock size:    129024 bytes
[    0.931318] UBI: smallest flash I/O unit:    2048
[    0.936059] UBI: sub-page size:              512
[    0.940702] UBI: VID header offset:          512 (aligned 512)
[    0.946573] UBI: data offset:                2048
[    1.359511] UBI: attached mtd2 to ubi0
[    1.363281] UBI: MTD device name:            "root"
[    1.368215] UBI: MTD device size:            507 MiB
[    1.373204] UBI: number of good PEBs:        4054
[    1.377945] UBI: number of bad PEBs:         2
[    1.382413] UBI: max. allowed volumes:       128
[    1.387063] UBI: wear-leveling threshold:    4096
[    1.391786] UBI: number of internal volumes: 1
[    1.396263] UBI: number of user volumes:     1
[    1.400724] UBI: available PEBs:             0
[    1.405200] UBI: total number of reserved PEBs: 4054
[    1.410186] UBI: number of PEBs reserved for bad PEB handling: 40
[    1.416319] UBI: max/mean erase counter: 1/0
[    1.420606] UBI: image sequence number: 0
[    1.424694] UBI: background thread "ubi_bgt0d" started, PID 462
[    1.431762] MV-643xx 10/100/1000 ethernet driver version 1.4
[    1.437667] mv643xx_eth smi: probed
[    1.443247] net eth0: port 0 with MAC address 00:50:43:xx:xx:xx
[    1.449426] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.456066] orion-ehci orion-ehci.0: Marvell Orion EHCI
[    1.461368] orion-ehci orion-ehci.0: new USB bus registered, assigned bus number 1
[    1.493733] orion-ehci orion-ehci.0: irq 19, io mem 0xf1050000
[    1.513731] orion-ehci orion-ehci.0: USB 2.0 started, EHCI 1.00
[    1.520299] hub 1-0:1.0: USB hub found
[    1.524106] hub 1-0:1.0: 1 port detected
[    1.528660] Initializing USB Mass Storage driver...
[    1.533779] usbcore: registered new interface driver usb-storage
[    1.539817] USB Mass Storage support registered.
[    1.544636] usbcore: registered new interface driver ums-datafab
[    1.550783] usbcore: registered new interface driver ums-freecom
[    1.556988] usbcore: registered new interface driver ums-jumpshot
[    1.563219] usbcore: registered new interface driver ums-sddr09
[    1.569342] usbcore: registered new interface driver ums-sddr55
[    1.575674] mice: PS/2 mouse device common for all mice
[    1.581442] rtc-mv rtc-mv: rtc core: registered rtc-mv as rtc0
[    1.587565] i2c /dev entries driver
[    1.591678] cpuidle: using governor ladder
[    1.596279] cpuidle: using governor menu
[    1.600469] sdhci: Secure Digital Host Controller Interface driver
[    1.606735] sdhci: Copyright(c) Pierre Ossman
[    1.611484] mmc0: mvsdio driver initialized, lacking card detect (fall back to polling)
[    1.620070] mv_xor_shared mv_xor_shared.0: Marvell shared XOR driver
[    1.626521] mv_xor_shared mv_xor_shared.1: Marvell shared XOR driver
[    1.663758] mv_xor mv_xor.0: Marvell XOR: ( xor cpy )
[    1.703753] mv_xor mv_xor.1: Marvell XOR: ( xor fill cpy )
[    1.743752] mv_xor mv_xor.2: Marvell XOR: ( xor cpy )
[    1.783753] mv_xor mv_xor.3: Marvell XOR: ( xor fill cpy )
[    1.793376] usbcore: registered new interface driver hiddev
[    1.799165] usbcore: registered new interface driver usbhid
[    1.804875] usbhid: USB HID core driver
[    1.808735] oprofile: hardware counters not available
[    1.813868] oprofile: using timer interrupt.
[    1.819438] TCP cubic registered
[    1.822687] NET: Registered protocol family 17
[    1.827373] lib80211: common routines for IEEE802.11 drivers
[    1.834498] rtc-mv rtc-mv: setting system clock to 2010-09-27 03:11:34 UTC (1285557094)
[    1.885360] UBIFS: mounted UBI device 0, volume 0, name "rootfs"
[    1.891403] UBIFS: file system size:   515966976 bytes (503874 KiB, 492 MiB, 3999 LEBs)
[    1.899473] UBIFS: journal size:       9033728 bytes (8822 KiB, 8 MiB, 71 LEBs)
[    1.906831] UBIFS: media format:       w4/r0 (latest is w4/r0)
[    1.912694] UBIFS: default compressor: zlib
[    1.916908] UBIFS: reserved for root:  0 bytes (0 KiB)
[    1.922593] VFS: Mounted root (ubifs filesystem) on device 0:13.
[    1.928676] Freeing init memory: 148K
INIT: version 2.88 booting
Using makefile-style concurrent boot in runlevel S.
Starting the hotplug events dispatcher: udevd.
Synthesizing the initial hotplug events...done.
Waiting for /dev to be fully populated...done.
Activating swap...done.
Cleaning up ifupdown....
Setting up networking....
Loading kernel modules...done.
Activating lvm and md swap...done.
Checking file systems...fsck from util-linux-ng 2.17.2
done.
Mounting local filesystems...done.
Activating swapfile swap...done.
Cleaning up temporary files....
Configuring network interfaces...done.
Cleaning up temporary files....
Setting kernel variables ...done.
Running scripts in rcS.d/ took 2 seconds.
INIT: Entering runlevel: 2
Using makefile-style concurrent boot in runlevel 2.
Starting OpenBSD Secure Shell server: sshd[    4.830417] NET: Registered protocol family 10
[    4.837116] ADDRCONF(NETDEV_UP): eth0: link is not ready
.
Running scripts in rc2.d/ took 1 seconds.

Debian GNU/Linux squeeze/sid sheeva02 ttyS0

sheeva02 login: [   11.276606] eth0: link up, 1000 Mb/s, full duplex, flow control disabled
[   11.283484] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

参考

Ubuntu 9.04 の設定

標準で内蔵されているSheeva Plug 用にカスタマイズされた Ubuntu は、設定ファイルの一部に不具合があり、うまく動かないところがあるので、修正する必要がある。xeonさんのページに詳しい説明があるので、それに従うだけ。

/etc/dhcp3/dhclient.conf

強制的に自分自身を DNS サーバとして認識させる設定があるので、せっかく DHCP サーバが DNS サーバの情報を伝えても、Sheeva Plug はそれを利用としない設定になっている。したがって、以下の行をコメントアウトする。

supersede domain-name-servers 127.0.0.1;

TimeZone

標準では UTC になっているので、JSTに設定する。

# dpkg-reconfigure tzdata

「Asia」→「Tokyo」の順に指定する。

時計

ここで設定する前に、U-Boot の date コマンドでだいたいの時刻に合わせておくのを忘れないこと。まだ DNS が引けないので、DNS サーバの IP アドレスを直接指定する。

# ntpdate -b 133.243.238.163 (ntp.nict.jp)
# hwclock -w

参考までに、2009-09-18 時点の代表的な DNS サーバの IP アドレスは、以下のとおり。(IPアドレスは予告なく変更されることがあるので、注意。)

  • ntp.nict.jp
    133.243.238.163
    133.243.238.164
    133.243.238.243
    133.243.238.244
  • ntp.jst.mfeed.ad.jp
    210.173.160.27
    210.173.160.57
    210.173.160.87

/etc/hosts

以下の行は不要なので、消去する。必要に応じて、IPアドレスとホスト名の対応表を追加する。

91.189.88.36 ports.ubuntu.com

/etc/rc.local

不要なエントリが多く含まれるので、以下の行をコメントアウトするなり、消去する。

insmod /boot/fat.ko
insmod /boot/vfat.ko
/root/discoverd
cd /
date 012618002009
hwclock -w

ロケール

日本語ロケールを指定したい場合は、以下のように設定する。

# locale-gen ja_JP.UTF-8
# echo 'LANG="ja_JP.UTF-8"' > /etc/default/locale

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-09-13 (金) 22:56:38 (1836d)