2. Linuxが動いた!
さてマイコンボードが動くことは確認できましたが、 問題はプログラムの開発です。 付属のH8-OSは、 Unixスタイルのネットワークプログラミング(socketとか)とはちょっと違っていて、 なんとなくこのまま大きなアプリを作って行くのには躊躇していました。 そこでAKI 3069ボード関連で検索したところ、このボード上で Linux を動かすプロジェクト uClinux-H8 を発見、さっそく試してみたところ、 試行錯誤の末ボード上でちゃんとLinuxを起動させることに成功しました。

開発用パソコン(Vine Linuxを使用)で、 使い慣れたCのライブラリで普通にプログラムを書いてコンパイルすれば ボード上で動くアプリケーションが作れてしまうのには感動、 H8 Linux を公開してくれているコミュニティの人達には大変感謝です。 これなら、そこそこ込み入ったアプリでも十分効率良く開発できそうです。

《 ← 前へ 》 《 次へ → 》

秋月3069ネットボードでuClinuxを動かすための手順
1. コンパイル環境(toolchain)の構築
Building a toolchain for use with eCos の手順に従ってインストールします。 この製作を行った時点では、 binutils は 2.14を、gcc は 3.3 をベースに構築することにしました。 ソースはGNUから取ってきます。 gcc-3.3 のパッチは リリースファイル の gcc-3.3 patch (gcc.diff-testing 2004-09-01 22:59) を取ってきて当てました。
 % bunzip2 < binutils-2.14.tar.bz2 | tar xvf -
 % mkdir (path-for-build)/binutils.2.14
 % cd (path-for-build)/binutils.2.14
 % (path-for-extract)/binutils-2.14/configure --target=h8300-elf --prefix=/usr/lo
 cal/h8300-elf -v |& tee configure.out
 % make -w all |& tee make.out
 % su
 % make -w install |& tee make-install.out
後の elf2flt のコンパイルのために、 binutilsをbuildしたディレクトリは消さないでとっておきます。
 % bunzip2 < gcc-3.3.2.tar.bz2 | tar xvf -
 % tar xfvz newlib-1.11.0.tar.gz
 % mv newlib-1.11.0/newlib gcc-3.3.2
 % mv newlib-1.11.0/libgloss gcc-3.3.2
 % patch -p0 < gcc.diff-testing |& tee gcc-3.3.2/patch.out
 % mkdir (path-for-build)/gcc-3.3.2
 % cd (path-for-build)/gcc-3.3.2
 % (path-for-extract)/gcc-3.3.2/configure --target=h8300-elf --prefix=/usr/local/
 h8300-elf --enable-languages=c,c++ --with-newlib -v | & tee configure.out
 % make -w all |& tee make.out
 % su
 % make -w install |& tee make-install.out
2. Bootローダ(eCos Redboot)を動かす
eCos Downloading and Installation の eCos にある手順に従ってまず Redhatのオリジナル版パッケージをインストールします。 H8版eCosの CVS treeには config toolが含まれていないので、 ここから流用するためです。
 % wget --passive-ftp ftp://ecos.sourceware.org/pub/ecos/ecos-install.tcl
 % sh ecos-install.tcl
 
 Please select a distribution site [2]
 Please select a directory for installation: (path-for-extract)
 Please select GNU tools to download and install: q
次に、 eCos/RedBoot for H8/300 の CVSから H8版 RedBootのソースツリーを持ってきます。
 % cvs -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/ecos-h8 login
 % cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/ecos-h8 co ecos
 % cd ecos
 % mv (path-for-ecos-2.0)/ecos-2.0/tools .
 % setenv ECOS_REPOSITORY (path-for-ecos-cvs)/ecos/packages
 % setenv PATH (path-for-ecos-cvs)/ecos/tools/bin:$PATH
ここまで準備ができたら、Redboot のイメージを作ります。 AKI-3069 ボードを選択して進めます。
 % mkdir (path-for-redboot-build)
 % cd (path-for-redboot-build)
 % ecosconfig new aki3068net redboot
 % ecosconfig add CYGPKG_IO_ETH_DRIVERS
 % ecosconfig add CYGPKG_DEVS_ETH_NS_DP83902A
 % ecosconfig check
 % ecosconfig tree
 % make |& tee make.out
Redbootのelfができているので、 S-record に変換して H8 の flush に h8writeで書き込みます。
 % cd install/bin
 % h8300-elf-objcopy -O srec redboot.elf redboot.mot
 (set DIP-SW 1101 : flush write)
 % h8write -3069 -f20 redboot.mot
Linux用のSerial Terminalソフトは minicom を使いました。 設定は 38400 bps 8bit parity none 1 stop bit です。 serialケーブルをつなぎ、minicomを起動してボードの電源を入れると、 Redbootの起動画面が現れます。 Networkの設定は、ホストPCにDHCPの設定をして取得させることもできるし、 ecos.eccをEditして直接埋め込むようにもできます。
 +DP83902A - eeprom ESA: 00:02:cb:01:63:2b
 ... waiting for BOOTP information
 Ethernet eth0: MAC address 00:02:cb:01:63:2b
 IP: 192.168.1.60/255.255.255.0, Gateway: 192.168.1.51
 Default server: 192.168.1.51
 
 RedBoot(tm) bootstrap and debug environment [ROM]
 Non-certified release, version UNKNOWN - built 23:26:17, Mar 22 2004
 
 Platform: Akizuki H8/3068 Network micom (H8/300H) 
 Copyright (C) 2000, 2001, 2002, Red Hat, Inc.
 
 RAM: 0x00400000-0x005f4000, [0x00400000-0x005f4000] available
 RedBoot> 
3. uClinux-H8を動かすためのツールの追加
genromfs を Linux ROM filesystem から取得してインストールします。
 % tar xfvz genromfs-0.5.1.tar.gz
 % cd genromfs-0.5.1
 % (edit Makefile to adjust paths for the system)
 % make
 % su
 % make install
elf2flt を uClinx CVSから取得してインストールします。 make の前に uClinux-h8 のリリースファイルにある パッチをあてます。
 % cvs -d:pserver:anonymous@cvs.uclinux.org:/var/cvs login
 % cvs -z3 -d:pserver:anonymous@cvs.uclinux.org:/var/cvs co -P elf2flt
 % cd elf2flt
 % wget http://keihanna.dl.sourceforge.jp/uclinux-h8/5236/elf2flt-20040524.diff
 % patch -p0 < elf2flt-20040524.diff |& tee patch.out
インストールしてある toolchain のパスに合わせてconfigure します。 このとき、binutils のソースを展開したディレクトリおよび buildしたディレクトリも必要になるので、それらも指定します。
 % ./configure --target=h8300-elf --prefix=/usr/local/h8300-elf --with-bfd-includ
 e-dir=/share/src/eCos/build/binutils.2.14/bfd --with-libbfd=/share/src/eCos/buil
 d/binutils.2.14/bfd/libbfd.a --with-libiberty=/usr/local/h8300-elf/lib/libiberty
 .a --with-binutils-include-dir=/share/src/eCos/binutils-2.14/include |& tee conf
 igure.out
 % make |& tee make.out
 % su
 % make install |& tee make-install.out
4. uClinux-H8を動かす (romfs版)
SourceForge の uClinux-H8をベースに構築します。
uClinx source distribution からまずオリジナルを一式とってきて、 uClinux-H8 リリースファイルの Utilities にあるパッチをあてます。 distributionは日々更新されていますが、 作業した時点では 20040408 のdistributionをベースに行いました。
 % gunzip < uClinux-dist-20040408.tar.gz | tar xfv -
 % wget http://keihanna.dl.sourceforge.jp/uclinux-h8/9195/uClinux-dist-20040408.d
 iff.gz
 % gunzip < uClinux-dist-20040408.diff.gz | patch -p0 |& tee patch.out
 % mv uClinux-dist uClinux-dist-20040408
 % cd uClinux-dist-20040408
 % mv ../patch.out .
Makefile をちょっと修正します。
 % diff vendors/Akizuki/AE3068/Makefile.orig vendors/Akizuki/AE3068/Makefile
 47,49c47,49
 < 	-flthdr -z $(ROMFSDIR)/bin/*
 < 	-flthdr -z $(ROMFSDIR)/sbin/*
 < 	-flthdr -z $(ROMFSDIR)/home/httpd/cgi-bin/*
 ---
 > 	-$(CROSS)flthdr -z $(ROMFSDIR)/bin/*
 > 	-$(CROSS)flthdr -z $(ROMFSDIR)/sbin/*
 > 	-$(CROSS)flthdr -z $(ROMFSDIR)/home/httpd/cgi-bin/*
build します。
 % setenv LANG C
 % make menuconfig
 Vendor/Product Selection --->
  --- Select the Vendor you wish to target
   (X) Akizuki
  --- Select the Product you wish to target
   (X) AE3068
 
 Kernel/Library/Defaults Selection --->
  Kernel Version
   (X) linux-2.4.x
 
 [*] Default all settings
 Exit -> Exit ->
 Save configuration -> Yes
 
 % make dep |& tee make-dep.out
 % make |& tee make.out
kernel と root filesystem が結合された download image が images/aki3068net-image.bin にできます。 ホストPCで DHCP server、tftp server の設定を行って、 AKI 3069 ボードが image を取得できる状態にします。 minicom を起動して、redbootのコマンド状態から、 tftp で image を downloadし、exec で uClinux を起動します。
 % cp images/aki3068net-image.bin /tftpboot/linux-romfs.bin
 % minicom
 +DP83902A - eeprom ESA: 00:02:cb:01:63:2b
 ... waiting for BOOTP information
 Ethernet eth0: MAC address 00:02:cb:01:63:2b
 IP: 192.168.1.60/255.255.255.0, Gateway: 192.168.1.51
 Default server: 192.168.1.51
 
 RedBoot(tm) bootstrap and debug environment [ROM]
 Non-certified release, version UNKNOWN - built 23:26:17, Mar 22 2004
 
 Platform: Akizuki H8/3068 Network micom (H8/300H) 
 Copyright (C) 2000, 2001, 2002, Red Hat, Inc.
 
 RAM: 0x00400000-0x005f4000, [0x00400000-0x005f4000] available
 RedBoot> load -r -v -m TFTP -b 0x400000 linux-romfs.bin
 /
 Raw file loaded 0x00400000-0x004d11b7, assumed entry at 0x00400000
 RedBoot> exec -c "console=ttySC1,38400n81"
 Now booting linux kernel:
  Entry Address 0x00400000
  Cmdline : console=ttySC1,38400n81
 Linux version 2.4.24-uc0 (ykoya@papaya) (gcc version 3.3) #1 Tue Apr 20 22:59:13
  PDT 2004
 
 uClinux H8/300H
 Target Hardware: AE-3068
 H8/300 series support by Yoshinori Sato <ysato@users.sourceforge.jp>
 Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne
 On node 0 totalpages: 1536
 zone(0): 0 pages.
 zone(1): 1536 pages.
 zone(2): 0 pages.
 Kernel command line: console=ttySC1,38400n81
 virtual vector at 0x00fffd20
 Calibrating delay loop... 3.25 BogoMIPS
 Memory available: 1012k/1209k RAM, 0k/0k ROM (660k kernel code, 174k data)
 Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)
 Inode cache hash table entries: 512 (order: 0, 4096 bytes)
 Mount cache hash table entries: 512 (order: 0, 4096 bytes)
 Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
 Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
 POSIX conformance testing by UNIFIX
 Linux NET4.0 for Linux 2.4
 Based upon Swansea University Computer Society NET3.039
 Initializing RT netlink socket
 Starting kswapd
 SuperH SCI(F) driver initialized
 ttySC0 at 0x00ffffb0 is a SCI
 ttySC1 at 0x00ffffb8 is a SCI
 ttySC2 at 0x00ffffc0 is a SCI
 ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)
 Last modified Nov 1, 2000 by Paul Gortmaker
 NE*000 ethercard probe at 0x200000: 00 02 cb 01 63 2b
 eth0: NE1000 found at 0x200000, using IRQ 17.
 Blkmem copyright 1998,1999 D. Jeff Dionne
 Blkmem copyright 1998 Kenneth Albanowski
 Blkmem 1 disk images:
 0: 4D1AEC-4EE6EB [VIRTUAL 4D1AEC-4EE6EB] (RO)
 NET4: Linux TCP/IP 1.0 for NET4.0
 IP Protocols: ICMP, UDP, TCP
 IP: routing cache hash table of 512 buckets, 4Kbytes
 TCP: Hash tables configured (established 512 bind 1024)
 VFS: Mounted root (romfs filesystem) readonly.
 Freeing unused kernel memory: 24k freed (0x4ae000 - 0x4b3000)
 Shell invoked to run file: /etc/rc
 Command: hostname AE3068
 Command: mount -t proc proc /proc
 Command: cat /etc/motd
 Welcome to
           ____ _  _
          /  __| ||_|                 
     _   _| |  | | _ ____  _   _  _  _ 
    | | | | |  | || |  _ \| | | |\ \/ /
    | |_| | |__| || | | | | |_| |/    \
    |  ___\____|_||_|_| |_|\____|\_/\_/
    | |
    |_|
 
 Akizukidenshi/AE-3068 (aki3069net) port.
 For further information check:
 http://www.uclinux.org/
 
 Execution Finished, Exiting
 init: cannot open inittab
 
 Sash command shell (version 1.1.1)
 /> ls
 tmp             sbin            var             usr             proc
 mnt             lib             home            etc             dev
 bin
 /> cat /proc/version
 Linux version 2.4.24-uc0 (ykoya@papaya) (gcc version 3.3) #1 Tue Apr 20 22:59:13
 PDT 2004
 /> cat /proc/gpio
 P1: OOOOOOOO
 P2: OOOOOOOO
 P3: IIIIIIII
 P4: --------
 P5: -------O
 P6: --------
 P8: ----OO--
 P9: --I-I-O-
 PA: --------
 PB: --OO----
 /> 
5. uClinux-H8を動かす (NFS-ROOT版)
NFS-ROOT版のkernelはホストPC上に root filesystemを持つので、 ボードのDRAMの容量に制限されず沢山のファイルを持つことができ、 またホストPCでコンパイルしたプログラムをいちいち転送せずにボードで即実行できるので便利です。 ただし、 ネットワークが常に必須となるので stand-alone では使えなくなります。

NFS-ROOT版kernelを構築するには、 menuconfig で configuration を変更します。 一度ROMFS版kernelを構築した後では、 CONFIG_BLK_DEV_BLKMEM を外しても linux-2.4.x/arch/h8300/platform/h8300h/aki3068net/crt0_ram.o が残ってしまいコンパイルに失敗するようなので、 その場合は一度手でcrt0_ram.oを rm するとうまくいきました。

 % make menuconfig
 Kernel/Library/Defaults Selection  --->
 [*] Customize Kernel Settings
 Exit -> Exit ->
 Save configuration -> Yes
 
 Block devices ->
  [*] Network block device support
  [ ] ROM disk memory block device (blkmem)
 
 Networking options ->
  [*]   IP: kernel level autoconfiguration
  [*]     IP: BOOTP support
  [*]     IP: RARP support
 
 File systems ->
  [ ] ROM file system support
  Network File Systems ->
  [*] NFS file system support
  [*]   Provide NFSv3 client support
  [*]   Root file system on NFS
 
 -> Exit -> Exit ->
 Save Kernel configuration -> Yes
 
 % make dep | & tee make-dep.out
 % rm linux-2.4.x/arch/h8300/platform/h8300h/aki3068net/crt0_ram.o
 % make |& tee make.out
 
 % cp images/aki3068net-image.bin /tftpboot/linux-nfsroot.bin
 % ( cd romfs ; tar cfv - . ) | ( cd /tftpboot/device-root ; tar xfv - )
 % su
 # cd /tftpboot/device-root/dev
 # mknod console c 5 1
 # mknod null c 1 3
 # mknod ttySC0 c 204 8
 # mknod ttySC1 c 204 9
 # mknod ttySC2 c 204 10
 # rm @*
 # exit
 %
上のように、 ホストPCに持ったAKI 3069ボードの root filesystem にデバイスファイルをあらかじめ作成しておきます。 redboot でボードに NFS-ROOT版のkernelをdownload して、 roop=/dev/nfs として起動します。 ホストPC上の nfs-root のパスは、 dhcpd.conf にあらかじめ設定して kernel 起動時に取得できるようにしておきます。
 % minicom
  +DP83902A - eeprom ESA: 00:02:cb:01:63:2b
 ... waiting for BOOTP information
 Ethernet eth0: MAC address 00:02:cb:01:63:2b
 IP: 192.168.1.60/255.255.255.0, Gateway: 192.168.1.51
 Default server: 192.168.1.51
 
 RedBoot(tm) bootstrap and debug environment [ROM]
 Non-certified release, version UNKNOWN - built 23:26:17, Mar 22 2004
 
 Platform: Akizuki H8/3068 Network micom (H8/300H) 
 Copyright (C) 2000, 2001, 2002, Red Hat, Inc.
 
 RAM: 0x00400000-0x005f4000, [0x00400000-0x005f4000] available
 RedBoot> load -r -v -m TFTP -b 0x400000 linux-nfsroot.bin
 /
 Raw file loaded 0x00400000-0x004f7b27, assumed entry at 0x00400000
 RedBoot> exec -c "console=ttySC1,38400n81 root=/dev/nfs"
 Now booting linux kernel:
  Entry Address 0x00400000
  Cmdline : console=ttySC1,38400n81 root=/dev/nfs
 Linux version 2.4.24-uc0 (ykoya@papaya) (gcc version 3.3) #2 Wed Apr 21 00:12:47
  PDT 2004
 
 uClinux H8/300H
 Target Hardware: AE-3068
 H8/300 series support by Yoshinori Sato <ysato@users.sourceforge.jp>
 Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne
 On node 0 totalpages: 1536
 zone(0): 0 pages.
 zone(1): 1536 pages.
 zone(2): 0 pages.
 Kernel command line: console=ttySC1,38400n81 root=/dev/nfs
 virtual vector at 0x00fffd20
 Calibrating delay loop... 3.25 BogoMIPS
 Memory available: 960k/1040k RAM, 0k/0k ROM (795k kernel code, 207k data)
 Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)
 Inode cache hash table entries: 512 (order: 0, 4096 bytes)
 Mount cache hash table entries: 512 (order: 0, 4096 bytes)
 Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
 Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
 POSIX conformance testing by UNIFIX
 Linux NET4.0 for Linux 2.4
 Based upon Swansea University Computer Society NET3.039
 Initializing RT netlink socket
 Starting kswapd
 SuperH SCI(F) driver initialized
 ttySC0 at 0x00ffffb0 is a SCI
 ttySC1 at 0x00ffffb8 is a SCI
 ttySC2 at 0x00ffffc0 is a SCI
 ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)
 Last modified Nov 1, 2000 by Paul Gortmaker
 NE*000 ethercard probe at 0x200000: 00 02 cb 01 63 2b
 eth0: NE1000 found at 0x200000, using IRQ 17.
 NET4: Linux TCP/IP 1.0 for NET4.0
 IP Protocols: ICMP, UDP, TCP
 IP: routing cache hash table of 512 buckets, 4Kbytes
 TCP: Hash tables configured (established 512 bind 1024)
 Sending BOOTP and RARP requests . OK
 IP-Config: Got BOOTP answer from 192.168.1.51, my address is 192.168.1.60
 IP-Config: Complete:
       device=eth0, addr=192.168.1.60, mask=255.255.255.0, gw=192.168.1.51,
      host=192.168.1.60, domain=test.net, nis-domain=(none),
      bootserver=192.168.1.51, rootserver=192.168.1.51, rootpath=/tftpboot/AE3069
 Looking up port of RPC 100003/2 on 192.168.1.51
 Looking up port of RPC 100005/1 on 192.168.1.51
 VFS: Mounted root (nfs filesystem).
 Freeing unused kernel memory: 32k freed (0x4d2000 - 0x4d9000)
 Shell invoked to run file: /etc/rc
 Command: hostname AE3068
 Command: mount -t proc proc /proc
 Command: cat /etc/motd
 Welcome to
           ____ _  _
          /  __| ||_|                 
     _   _| |  | | _ ____  _   _  _  _ 
    | | | | |  | || |  _ \| | | |\ \/ /
    | |_| | |__| || | | | | |_| |/    \
    |  ___\____|_||_|_| |_|\____|\_/\_/
    | |
    |_|
 
 Akizukidenshi/AE-3068 (aki3069net) port.
 For further information check:
 http://www.uclinux.org/
 
 Execution Finished, Exiting
 init: cannot open inittab
 
 Sash command shell (version 1.1.1)
 /> cat /proc/version
 Linux version 2.4.24-uc0 (ykoya@papaya) (gcc version 3.3) #2 Wed Apr 21 00:12:47
  PDT 2004
 /> mount
 rootfs on / type rootfs (rw)
 /dev/root on / type nfs (ro,v2,rsize=4096,wsize=4096,hard,udp,nolock,addr=192.16
 8.1.51)
 /proc on /proc type proc (rw)
 /> cat /proc/filesystems
 nodev	rootfs
 nodev	bdev
 nodev	proc
 nodev	sockfs
 nodev	pipefs
 nodev	ramfs
 nodev	nfs
 />  
《 ← 前へ 》 《 次へ → 》