CQ出版社のトップページへ
組み込みシステム開発評価キットのサポートページへ

組み込みシステム開発評価キット

オプションCPUカード/ARM9


ATMEL SAM-BAツールを使った Bootstrap, u-bootの書き換え手順

 Interface2012年3月号「ARM9 CPUカードのLinuxにBLANCA用デバイス・ドライバを移植する」の開発環境の構築でビルドしたBootstrap, u-bootおよびカーネルの書き換えこの方法について解説します。
 書き換える前のシステムでは、CPU内蔵フラッシュROMにはNORフラッシュROMに書かれたLinuxカーネルを直接起動させるBootstrapが、また NORフラッシュにはLinuxカーネルzImageとルートファイルシステム、ユーザファイルシステムが書かれています。以降の作業では、ルートファイルシステムとユーザファイルシステムはそのままに、それ以外を新しいイメージへ更新します。

●手順1 ROMBOOTでの起動
 CPUカード上の「CPU内蔵フラッシュ消去ジャンパ(J1)」オープンにして、電源を入れます。 CPU内蔵フラッシュのデータが消去され、ROMBOOTプログラムが立ち上がります。

●手順2 ターゲットとの接続
SAM-BAツールを立ち上げます。



適切なポート(シリアルポート/USB CDC/JLINKなど)を選択します。カスタマイズがされていなければボードにはat91sam9e256-ekを選択し、Connectボタンを押します。しばらくするとメイン画面が立ち上がります。



●手順3 Bootstrapの書き込み
 (1)「Flash」タブが選択されているのを確認して、(2)「Send File Name」にBootstrapのビルドバイナリファイル norflash_blanca_arm9.binを選択します。(3)「Address」は0x200000であることを確認して、(4)「Send File」ボタンを押します。 書き込みが終わったら、Scriptsのプルダウンから(5)「Boot from Flash[GPNVM3]」を選択肢、(6)「Execute」ボタンを押します。



●手順4 NORフラッシュを有効にする
 (1)「NorFlash」タブを選択し、(2)Scriptsから「Enable NorFlash」を選択し、(3)「Execute」ボタンを押します。これで、外部バスコントローラが初期化され、NORフラッシュROMへアクセスできるようになります。



●手順5 NORフラッシュデータの退避
 データの退避が不要ならこの手順項は読み飛ばしてください。後日元に戻したり、万が一データを壊したときに復帰できるよう、NORフラッシュデータのバックアップを取っておくことをお勧めします。
 退避する範囲を(1)「Address」(NORフラッシュROMの先頭アドレスからのオフセット)および(2)「Size (For Receive File)」に指定します。フラッシュROMのデータすべてを退避する場合はAddressは0x0、サイズは0x800000となります。本作業では書き換えるのはフラッシュROMの先頭からカーネル領域までの2MBなので、Addressは0x0に、退避するサイズを0x200000とすれば少なくとも十分です。 (3)「Receive File Name」に読み出したデータを格納するファイルを指定し、(4)「Receive File」ボタン押します。 しばらく待つと読み出しが終わります。



●手順6 u-bootの書き込み
 (1)「Send File Name」にu-bootのビルドバイナリファイル u-boot.binを選択します。(2)「Address」は0x8000に変更し、(3)「Send File」ボタンを押します。



●手順7 カーネルの書き込u-bootの書き込み
 続けて、u-bootと同様の手順で(1)「Send File Name」にカーネルイメージuImageを選択します。(2)「Address」は0x40000に変更し、(3)「Send File」ボタンを押します。しばらく待つと書き込みが終わります。



●手順8 再起動
 いったん電源を切ります。 ジャンパJP1をショートし、電源を入れなおします。これでカーネルが起動するはずです。

 以上で書き換えは終わりです。
 正しく起動できたときのコンソール出力を以下に示します。
Start AT91Bootstrap...
 
 
U-Boot 1.3.4 (Jan 21 2012 - 23:25:11)
 
DRAM:  64 MB
Flash:  8 MB
*** Warning - bad CRC, using default environment
 
In:    serial
Out:   serial
Err:   serial
Net:   macb0
macb0: Starting autonegotiation...
macb0: Autonegotiation complete
macb0: link up, 100Mbps full-duplex (lpa: 0x45e1)
Hit any key to stop autoboot:  0
## Booting kernel from Legacy Image at 22000000 ...
   Image Name:   Linux-2.6.33
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1432344 Bytes =  1.4 MB
   Load Address: 20008000
   Entry Point:  20008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK
 
Starting kernel ...
 
Uncompressing Linux... done, booting the kernel.
Linux version 2.6.33 (hoso@vmubu) (gcc version 4.5.2 (Sourcery G++ Lite 2011.03-41) ) #1 Sat Jan 21 16:35:34 JST 2012
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: CQpub BLANCA ARM9
Memory policy: ECC disabled, Data cache writeback
Clocks: CPU 198 MHz, master 99 MHz, main 18.432 MHz
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: console=ttyS0,115200 root=/dev/mtdblock1 mtdparts=physmap-flash.0:2m(kernel),5m(user1),1m(user2) ro init=/bin/msh
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 61980KB available (2444K code, 245K data, 112K init, 0K highmem)
Hierarchical RCU implementation.
NR_IRQS:192
AT91: 96 gpio irqs in 3 banks
Console: colour dummy device 80x30
console [ttyS0] enabled
Calibrating delay loop... 99.12 BogoMIPS (lpj=495616)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
devtmpfs: initialized
NET: Registered protocol family 16
XXXXX blanca_bios_configure() start! XXXX
XXX Found AVPS !!! XXX
XXX Found IOPS !!! XXX
AT91: Power Management
AT91: Starting after user reset
bio: create slab <bio-0> at 0
SCSI subsystem initialized
Switching to clocksource tcb_clksrc
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NetWinder Floating Point Emulator V0.97 (double precision)
squashfs: version 4.0 (2009/01/31) Phillip Lougher
JFFS2 version 2.2. (NAND) (SUMMARY)  c 2001-2006 Red Hat, Inc.
msgmni has been set to 121
alg: No test for stdrng (krng)
io scheduler noop registered (default)
blanca LEDI found at 0x31400000 (size=0x3fffff), cs=5
LEDI: CQ Pub, Interface LEDI at 31400000
ifrgbc: fb 4096 KB mapped at 0xc6000000
fb0: IFRGBC frame buffer device
atmel_usart.0: ttyS0 at MMIO 0xfefff200 (irq = 1) is a ATMEL_SERIAL
atmel_usart.1: ttyS1 at MMIO 0xfffb0000 (irq = 6) is a ATMEL_SERIAL
atmel_usart.2: ttyS2 at MMIO 0xfffb4000 (irq = 7) is a ATMEL_SERIAL
brd: module loaded
loop: module loaded
physmap platform flash device: 00800000 at 10000000
physmap-flash.0: Found 1 x16 devices at 0x0 in 16-bit bank
 Amd/Fujitsu Extended Query Table at 0x0040
number of CFI chips: 1
3 cmdlinepart partitions found on MTD device physmap-flash.0
Creating 3 MTD partitions on "physmap-flash.0":
0x000000000000-0x000000200000 : "kernel"
0x000000200000-0x000000700000 : "user1"
0x000000700000-0x000000800000 : "user2"
macb macb: invalid hw address, using random
MACB_mii_bus: probed
eth0: Atmel MACB at 0xfffc4000 irq 21 (f2:1e:80:c5:3a:e0)
eth0: attached PHY driver [SMSC LAN8700] (mii_bus:phy_addr=ffffffff:06, irq=-1)
ifnic.c:v0.91Aug 25. 2008
blanca found at 0x50800000 (size=0x7fffff) irq=31, cs=18
ifnic rev 02.00 at blanca, irq 31
mice: PS/2 mouse device common for all mice
blanca iPS2 found at 0x53000000 (size=0x7fffff) irq=31, cs=23
input: ifmouse as /class/input/input0
input: CQ Pub, Interface iPS/2 mouse at 53000000 irq 31
Registered led device: d1
Registered led device: d2
Registered led device: d3
Registered led device: d4
Registered led device: d8
Registered led device: d9
TCP cubic registered
VFS: Mounted root (ext2 filesystem) readonly on device 31:1.
devtmpfs: mounted
Freeing init memory: 112K
#


NORフラッシュに書かれていたカーネルイメージのuImage化

 バックアップしたROMイメージに書き換える前のカーネルが格納されています。これを今回入れ替えたu-bootから起動できるようにuImageへ変換します。

●手順1 カーネルを見つける
カーネルはROMの先頭から格納されています。サイズはビルドごとに異なるので、バイナリエディタなどを使ってで終了アドレスを探します。筆者の環境ではオフセット0x16c908番地以降がすべてデータがFFだったので0x0〜0x16c907(1,493,256バイト)がカーネルと判断しました。

●手順2 カーネルを取り出す
dd ツールなどで、バックアップイメージからカーネルイメージのみを取り出し、ファイルにします。
$ dd if=norflash_backup.bin of=zImage bs=1 count=1493256

●手順3 uImageへ変換する
mkimageツールでuImageへ変換します。
$ mkimage -A arm -O linux -C none -T kernel -a 20080000 -e 20080000 -n linux-2.6-BLANCA-ORG -d zImage uImage-BLANCA-ORG.bin
出力されたファイル uImage-BLANCA-ORG.bin をNORフラッシュROMのオフセット0x40000に書き戻します。