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に書き戻します。