eCos on CAT709


eCos on CAT709

eCos/Redbootの移植

ビルド

  • ecos-2.0にパッチをあてる
    % cd $ECOS_DIR
    % patch -p1 < /tmp/ecos-2.0-cat709-20050511.diff
  • redbootをビルドする
    % cd /tmp/ROM
    % $ECOS_DIR/tools/bin/ecosconfig --srcdir=$ECOS_REPOSITORY new cat709 redboot
    % $ECOS_DIR/tools/bin/ecosconfig --srcdir=$ECOS_REPOSITORY 
        import $ECOS_REPOSITORY/hal/sh/cat709/v2_0/misc/redboot_ROM.ecm
    % $ECOS_DIR/tools/bin/ecosconfig --srcdir=$ECOS_REPOSITORY tree
    % make

RedbootをFROMに書き込む

注意
RedBoot?の書き込みにはEK709とROMライターが必要となります。これらが揃わない場合には書き込みができません(たぶん)。iplを元に戻すことができるような環境でご使用ください。
RedBoot?ではEEPROMのアクセスを行います。このため、EEPROMの情報を破壊する可能性がありますので、MACアドレスなどEEPROMに保存している情報をあらかじめ記録しておいてください。

PLD-PGMとJTAG Toolsを使った書き込み

  • PLD-PGMとの配線
    PLD-PGM		CAT709
    J3-1		CN2-26A		VCC
    J3-2		CN9-7B		GND
    J3-4		CN9-1A		TCK
    J3-6		CN9-3A		TDO
    J3-7		CN9-6A		TDI
    J3-9		CN9-5A		TMS
  • フラッシュへの書き込み
# jtag
jtag> cable parallel 0x378 DLC5
jtag> detect
jtag> initbus sh7727
jtag> flashmem 0x00000000 redboot.bin

RedbootからLinuxを起動する

コンパクトフラッシュからの起動

  • Linuxの設定
    .config
    #CONFIG_SH_STANDARD_BIOS is not set
  • Linuxの起動
    load -r -b 0x8c210000 -m disk hda1:/boot/zImage
    exec -c "ro root=0301 console=ttySC0,38400 ide0=0xba0001f0,0xba0003f6,34"

フラッシュROMからの起動

  • Linuxの修正
    LinuxにフラッシュROM上のredbootパーティションを認識させなければならない。.configの修正だけで済ませる方法がわからなかったので、drivers/mtd/maps/cat709.cを修正した。(ここにパッチを置きたい)
  • zImageをフラッシュROMに書き込む
    RedBoot> load -r -b 0x8c210000 -m tftp -h 192.168.0.240 CAT709/zImage
    RedBoot> fis create -b 0x8c210000 -l 0x00100000 zImage
  • rootfs.img(jffs2)の作成
    • http://sources.redhat.com/jffs2/からmkfs.jffs2をダウンロードする。
    • CAT709のCD-ROMにあるuserland/target-2004を解凍し、環境に合わせてファイルを修正する。(/etc/hosts, /etc/inittab, /etc/network/interfaces, /etc/resolv.con,/etc/securettyを修正した)
    • CAT709のCD-ROMのuserland/buildjffs2.shを実行し、rootfs.imgを作成する。
  • rootfs.imgをフラッシュROMに書き込む
    http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/arm/SA1100/Assabetを参考にredbootに書き込む。以下の例では、rootfs.imgのサイズより大きなフラッシュ空間を割り当てている(この場合は、残りのフラッシュ空間すべて)。rootfs.imgのサイズだけパーティションを作成すると(loadとfis createコマンドだけで済むのだが)、Linuxでファイルの新規作成が出来なかった。
    0x6c0000: フラッシュROMの空領域サイズ
    0x560000: rootfs.imgのサイズ
    
    RedBoot> fis free
      0x80120000 .. 0x807E0000
    RedBoot> fis erase -f 0x80120000 -l 0x6c0000
    RedBoot> load -r -b 0x8c210000 -m tftp -h 192.168.0.240 CAT709/jffs2.img
    Raw file loaded 0x8c210000-0x8c76ffff, assumed entry at 0x8c210000
    RedBoot> fis write -b 0x8c210000 -l 0x00560000 -f 0x80120000
    RedBoot> fis create jffs2 -n -f 0x80120000 -l 0x006c0000 -e 0x00000000
  • Linuxを起動する
    Linuxの起動メッセージをみて、jff2がどのパーティションにあるか調べて、kernel cmdlineを決める。
    Creating 5 MTD partitions on "CAT709 Flash1":
    0x00000000-0x00020000 : "RedBoot"
    0x00020000-0x00120000 : "zImage"
    0x00120000-0x007e0000 : "jffs2"
    0x007e0000-0x007e1000 : "RedBoot config"
    mtd: partition "RedBoot config" doesn't end on an erase block -- force read-only
    0x007f0000-0x00800000 : "FIS directory"
    この場合は、jffs2は2番目にあるので、kernel cmdlineにroot=/dev/mtblock2と設定してLinuxを起動する。(/etc/fstabを修正する必要があるかもしれない)
    mtd:のメッセージは気になるけど...
    RedBoot> fis load zImage
    RedBoot> exec -c "console=ttySC0,38400 root=/dev/mtdblock2"

TFTP、NFSROOTでの起動

  • Linuxの設定
    .config
    #CONFIG_SH_STANDARD_BIOS is not set
    CONFIG_ROOT_NFS=y
    CONFIG_NE2000=y
  • Linuxの起動
    load -r -b 0x8c210000 -m tftp -h 192.168.0.240 CAT709/zImage
    exec -c "console=ttySC0,38400 root=/dev/nfs ip=192.168.0.182
       nfsroot=192.168.0.240:/tftpboot/CAT709/rootfs-NFS"

eCosプログラム作成


hello.c

  • eCosのビルド
    % setenv ECOS_REPOSITORY ${ECOS_DIR}/packages
    % {ECOS_DIR}/tools/bin/ecosconfig --srcdir=${ECOS_REPOSITORY} new cat709
    % {ECOS_DIR}/tools/bin/ecosconfig --srcdir=${ECOS_REPOSITORY} tree
    % make
  • hello.cアプリケーションのビルド
    % cp ${ECOS_DIR}/examples/hello.c .
    % sh-elf-gcc -m3 -ml -g -Iinstall/include/ -Linstall/lib/ -Ttarget.ld -nostdlib hello.c
  • hello.cアプリ実行
    RedBoot> load -m tftp -h 192.168.0.240 CAT709/a.out
    Entry point: 0x8c020000, address range: 0x8c020000-0x8c03140c
    RedBoot> go
    Hello, eCos world!

    hal_sh_cat709.cdlのCYG_HAL_STARTUPのdefault_valueがRAMの場合は次のようになる
    RedBoot> load -m tftp -h 192.168.0.240 CAT709/a.out
    *** Abort! Attempt to load ELF data to address: 0x80000000 which is not in RAM

    リンカスクリプト(target.ld)がセクションをROMに割り当てるのにそのアドレスにロードできないってことだろう。
  • gdb
    • 実行
      % sh-elf-gdb -nw a.out
      (gdb) target remote 192.168.0.182:9000
      (gdb) load
      (gdb) continue
      Continuing.
      Hello, eCos world!
      今は「Hello, eCos world!」が表示されなくなった(05/13)
      (gdb) continue
      Continuing.
      一つ前のパッチだと表示される。なぞだ
  • デバッグ