〜 秋月H8/3069F USBホストボードでuClinux-H8を動かす 〜
yk@tinywillow.com July 22, 2006
秋月電子H8/3069F USBホストボードでuClinux-H8を動かしてみる実験です。 MP3 Player製作記で使った H8/3069F LANボードのネットワークI/FがUSB I/Fに変わり、クロックも25MHzになっています。 これでuClinuxが動かせれば、Linuxの豊富なドライバ資産をつかって市販の色々なデバイスを接続できて何か面白いことができそうです。とりあえず USB host機能をもったミニLinux組み込みボード素材として動作するところまでを目標に実験しました。
1. DRAMの拡張
まずはいきなり、DRAMの拡張です。 USB機能を有効にしたkernelはサイズも大きくなり、また2.4.xではどうもUSBまわりが安定せず2.6.xをベースにすることにしたので、2MBのままではメモリが足りず起動もままなりません。メモリの節約にあれこれ時間を割くくらいならとっとと拡張してしまいます。 もう、ボード購入と同時に 16MビットDRAM(HM5117805LTT6)も買ってしまった方が吉です。
拡張の手順は、MP3 Player製作記の 「メモリが足りない」や AE-3069(Aki3069net)でDRAM増設 と同じです。 今回はRASのpull-upすら省略していますが、問題なく動いています。
2. Redbootの作成
次に、kernelローダのRedbootを用意します。 eCos/Redboot for H8 のCVSでは、現時点でpegasusチップ (ADM8511) を使っているUSBネットワークアダプタを経由してdownloadが動作するソースが公開されており、これを基にRedbootのイメージをbuildします。また、メモリサイズを4MBにする変更も、上記リンクの手順を参考に適用します。

手順は、MP3 Player製作記の 「Bootローダ(eCos Redboot)を動かす」と同様で、config toolsとecosH8のCVSを準備しておき、 ターゲット名に ae3069usbを指定してイメージを作ります。 pegasus使用のUSBネットワークアダプタとして BUFFALO LUA2-TXを入手して使いました。 使用するUSB-ethernetアダプタのVENDOR/PRODUCT IDを調べておいて、 ecos.eccの中のパラメータを変更します。

 % mkdir redboot.ae3069usb
 % cd redboot.ae3069usb
 % ecosconfig new ae3069usb
 % ecosconfig add CYGPKG_IO_ETH_DRIVERS
 % vi ecos.ecc
   (cdl_option CYGHWR_H8300_AE3069USB_ETH_VENDOR {
        user_value 0x0411
    cdl_option CYGHWR_H8300_AE3069USB_ETH_PRODUCT {
        user_value 0x0009
   )
 % (DRAM増設のためのその他の修正:上記リンク参照)
 % vi (your-ecos-directory)/packages/devs/eth/h8300/ae3069usb/current/src/if_ae30
 69usb.c
   (#define DEBUG 1 -> #define DEBUG 0
    add #define CYGHWR_H8300_AE3069USB_SL811HS_INT 0
   )
 % ecosconfig check
 % ecosconfig tree
 % make |& tee make.log
 %
pegasusチップを使っているアダプタを持っていて、とりあえず試してみたい方のために、 作成した redbootのイメージを こちらに置きました。 このイメージは、DRAMを4MBに拡張してあるボードが対象ですのでご注意ください。
3. uClinuxの構築
uClinuxは、 uClinx source distribution 20051110版をベースに構築しました。 uClinux-H8の成果は随時本家の方へ取り込まれているようですが、 そのまま動作させるにはさらに若干の パッチが必要でした。(Yoshinori Sato さん、ありがとうございました。)

この状態では、まだH8/3069 USBホストボードの configuration が含まれていないので、 H8/3069ネットボードの configuration を参考に、パッチを作りました。 こちらのパッチは、 上記のパッチも含んだものになっているので、dist-20051110 にこれだけあてて、下記の手順で3069USB向けのイメージが構築できます。 kernelは、2.6.x を選択します。また、コンパイルは h83000-linux-elf を使うようになっているので、 Toolchainのビルド(OSCJ.net)などを参考に準備しておきます。

 % tar xfvz uClinux-dist-20051110.tar.gz
 % mv uClinux-dist uClinux-dist-20051110
 % cd uClinux-dist-20051110
 % patch -p1 < ../patch_for_uClinux-dist20051110_060709.diff |& tee patch.log
 % make menuconfig
 Vondor/Product Selection  --->
 
 --- Select the Vendor you wish to target
 (Akizuki) Vendor
 --- Select the Product you wish to target
 (AE3069USB) Akizuki Products
 
 Kernel/Library/Defaults Selection  --->
 
 (linux-2.6.x) Kernel Version
 (uClibc) libc Version
 [*] Default all settings (lose changes) (NEW)
 [ ] Customize Kernel Settings (NEW)
 [ ] Customize Vendor/User Settings (NEW)
 [ ] Update Default Vendor Settings (NEW)
 
 Do you wish to save your new kernel configuration?
 
                 < Yes >      <  No  >
 
 % make |& tee make.log
 % ls images
 aki3069usb-image.bin    aki3069usb-imagez.bin
 %
default の configuration では、Ethernetとしてpegasusドライバ、 USBメモリのためにvfat filesystemとSCSIドライバ、 それとUSBの動作確認のための usbfs が含まれています。 また、ボードのDRAMは4MBに拡張済みを前提としたメモリサイズに変更しています。 試してみたい方のために、コンパイルしたイメージを こちらに置いておきます。

パッチに含まれている変更は、おおまかに以下の通りです。

  1. H8/3069ネットボードのための configuration をUSBボード向けにコピー、clock を25MHz に変更。
  2. le16_to_cpus()で、アドレスが word alignされていないと正しく動作しないようなので、le16_to_cpu()を使うように変更。(linux-2.6.x/drivers/usb/core/hub.c)
  3. le32_to_cpus()で、アドレスが word alignされていないと正しく動作しないようなので、直接バイトアクセスするように変更。(linux-2.6.x/drivers/usb/net/pegasus.c)
  4. USBコントローラ(sl811)のデバイス定義を追加。(linux-2.6.x/arch/h8300/platform/h8300h/aki3069usb/aki3069usb_init.c)
  5. (おそらく)H8での性能制限により、SL811 の設定タイミングを見込んでいる値が小さすぎるようだったので修正。(linux-2.6.x/drivers/usb/host/sl811-hcd.c)
  6. メモリサイズを 4MB に変更。
  7. kmallocでGFP_DMAフラグが付いているとうまくメモリがとれないようなので必要に応じて削除。
  8. scsiまわりの細かな修正。(scatterlist.h, posix_types.h等)
  9. 時刻設定をするとハングする問題を修正。(linux-2.6.x/arch/h8300/kernel/time.c)
4. 動作テスト
作成した redboot を 3069 に書き込みます。
 % cd redboot.ae3069usb
 (set DIP-SW 0100 : flush write)
 % h8write -3069 -f25 install/bin/redboot.srec
シリアルコンソール、USBネットワークアダプタをつないで、電源を入れます。 redbootが起動するので、コンパイルしたイメージをdownloadします。 なお、現在の版の redboot では、HUB経由はサポートしていないようなので、USBネットワークアダプタはボードのUSBコネクタに直接つなぎます。 ホストマシンでは、tftpbootの設定が済んでいて、aki3069usb-image.binがdownload可能の場所に置いてあるものとします。
 +ADM8511 - eeprom ESA: 00:0d:0b:46:e9:e5                                        
 ... waiting for BOOTP information                                               
 Ethernet eth0: MAC address 00:0d:0b:46:e9:e5                                    
 IP: 192.168.1.102/255.255.255.0, Gateway: 192.168.1.1                           
 Default server: 0.0.0.0                                                         
                                                                                 
 RedBoot(tm) bootstrap and debug environment [ROM]                               
 Non-certified release, version UNKNOWN - built 00:52:32, Apr 24 2006            
                                                                                 
 Platform: Akizuki H8/3069 USB Host Board (H8/300H)                              
 Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.                        
                                                                                 
 RAM: 0x00400000-0x005f4000, [0x00400000-0x005f4000] available                   
 RedBoot> ip_address -h 192.168.1.100
 IP: 192.168.1.102/255.255.255.0, Gateway: 192.168.1.1                           
 Default server: 192.168.1.100                                                   
 RedBoot> load -r -v -m TFTP -b 0x400000 /private/tftpboot/uc/aki3069usb-image.bi
 n
 RedBoot> 
このままuClinuxを起動しても問題ないのですが、デパイスが検出された時のメッセージを順番に見ていきたいので、一旦USBネットワークアダプタを外して何もつながない状態にして起動してみます。
 (LUA2-TXを外す)
 RedBoot> exec -c "console=ttySC1,38400n81"
 Now booting linux kernel:                                                       
  Entry Address 0x00400000                                                       
  Cmdline : console=ttySC1,38400n81                                              
 Linux version 2.6.12-uc0 (ykoya@kiwi.local) (gcc version 3.4.3) #1 Sun Jul 9 16:
 52:01 PDT 2006                                                                  
                                                                                 
                                                                                 
 uClinux H8/300H                                                                 
 Target Hardware: AE-3069 USB                                                    
 Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne             
 H8/300 series support by Yoshinori Sato <ysato@users.sourceforge.jp>            
 Built 1 zonelists                                                               
 Kernel command line: console=ttySC1,38400n81                                    
 virtual vector at 0x00fffd20                                                    
 PID hash table entries: 64 (order: 6, 1024 bytes)                               
 Dentry cache hash table entries: 2048 (order: 1, 8192 bytes)                    
 Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)                     
 Memory available: 2092k/614k RAM, 0k/0k ROM (1321k kernel code, 243k data)      
 Mount-cache hash table entries: 512                                             
 NET: Registered protocol family 16                                              
 SCSI subsystem initialized                                                      
 usbcore: registered new driver usbfs                                            
 usbcore: registered new driver hub                                              
 SuperH SCI(F) driver initialized                                                
 ttySC0 at MMIO 0xffffb0 (irq = 54) is a sci                                     
 ttySC1 at MMIO 0xffffb8 (irq = 58) is a sci                                     
 ttySC2 at MMIO 0xffffc0 (irq = 62) is a sci                                     
 io scheduler noop registered                                                    
 uclinux[mtd]: RAM probe address=0x5995b4 size=0x3f000                           
 Creating 1 MTD partitions on "RAM":                                             
 0x00000000-0x0003f000 : "ROMfs"                                                 
 uclinux[mtd]: set ROMfs to be root filesystem                                   
 sl811: driver sl811-hcd, 19 May 2005                                            
 sl811-hcd sl811-hcd: SL811HS v1.5                                               
 sl811-hcd sl811-hcd: new USB bus registered, assigned bus number 1              
 sl811-hcd sl811-hcd: irq 12, io mem 0x00200000                                  
 hub 1-0:1.0: USB hub found                                                      
 hub 1-0:1.0: 1 port detected                                                    
 Initializing USB Mass Storage driver...                                         
 usbcore: registered new driver usb-storage                                      
 USB Mass Storage support registered.                                            
 pegasus: v0.6.12 (2005/01/13), Pegasus/Pegasus II USB Ethernet driver           
 usbcore: registered new driver pegasus                                          
 NET: Registered protocol family 2                                               
 IP: routing cache hash table of 512 buckets, 4Kbytes                            
 TCP established hash table entries: 512 (order: 0, 4096 bytes)                  
 TCP bind hash table entries: 512 (order: -1, 2048 bytes)                        
 TCP: Hash tables configured (established 512 bind 512)                          
 VFS: Mounted root (romfs filesystem) readonly.                                  
 Freeing unused kernel memory: 48k freed (0x581000 - 0x58c000)                   
                                                                                 
 Shell invoked to run file: /etc/rc                                              
 Command: hostname AE3069USB                                                     
 Command: mount -t proc proc /proc                                               
 Command: mount -t usbfs none /proc/bus/usb                                      
 Command: cat /etc/motd                                                          
 Welcome to                                                                      
           ____ _  _                                                             
          /  __| ||_|                                                            
     _   _| |  | | _ ____  _   _  _  _                                           
    | | | | |  | || |  _ \| | | |\ \/ /                                          
    | |_| | |__| || | | | | |_| |/    \                                          
    |  ___\____|_||_|_| |_|\____|\_/\_/                                          
    | |                                                                          
    |_|                                                                          
                                                                                 
 Akizukidenshi/AE-3069USB (aki3069usb) port.                                     
 For further information check:                                                  
 http://www.uclinux.org/                                                         
                                                                                 
 Execution Finished, Exiting                                                     
 init: Failed to open /etc/inittab.                                              
 Sash command shell (version 1.1.1)                                              
 /> 
それでは、USB hub、USBネットワークアダプタ、USBメモリ、と順番に接続していって、動作テストしてみます。
 /> (USB hubを接続)
 /> usb 1-1: new full speed USB device using sl811-hcd and address 2             
 hub 1-1:1.0: USB hub found                                                      
 hub 1-1:1.0: 4 ports detected                                                   
                                                                                 
 /> (LUA2-TXを接続)
 /> usb 1-1.3: new full speed USB device using sl811-hcd and address 3           
 pegasus 1-1.3:1.0: setup Pegasus II specific registers                          
 pegasus 1-1.3:1.0: eth0, MELCO/BUFFALO LUA2-TX, 00:0d:0b:46:e9:e5               
                                                                                 
 /> (USBメモリを接続)
 /> usb 1-1.1: new full speed USB device using sl811-hcd and address 4           
 scsi0 : SCSI emulation for USB Mass Storage devices                             
   Vendor: Fujifilm  Model: USB Drive         Rev: 4.20                          
   Type:   Direct-Access                      ANSI SCSI revision: 00             
 SCSI device sda: 499712 512-byte hdwr sectors (256 MB)                          
 sda: Write Protect is off                                                       
 sda: assuming drive cache: write through                                        
 SCSI device sda: 499712 512-byte hdwr sectors (256 MB)                          
 sda: Write Protect is off                                                       
 sda: assuming drive cache: write through                                        
  sda: sda1                                                                      
 Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0               
                                                                                 
 />                                                                              
 /> 
各デバイスが認識されて、メッセージが表示されています。

USBネットワークアダプタとUSBメモリを同時に動作させるテストとして、ホストのmotdをUSBメモリへftpしてみます。

 /> ifconfig eth0 192.168.1.102
 /> ifconfig eth0
 eth0      Link encap:Ethernet  HWaddr 00:0D:0B:46:E9:E5                         
           inet addr:192.168.1.102  Bcast:192.168.1.255  Mask:255.255.255.0      
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1                    
           RX packets:2 errors:0 dropped:0 overruns:0 frame:0                    
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                  
           collisions:0 txqueuelen:1000                                          
                                                                                 
 /> mount -t vfat /dev/sda1 /mnt
 /> mount
 /dev/root on / type romfs (ro)                                                  
 /proc on /proc type proc (rw,nodiratime)                                        
 none on /proc/bus/usb type usbfs (rw)                                           
 /dev/sda1 on /mnt type vfat (rw,nodiratime,fmask=0022,dmask=0022,codepage=cp437,
 iocharset=iso8859-1)                                                            
 /> cd /mnt
 /mnt> mkdir tmp
 /mnt> cd tmp
 /mnt/tmp> ftp 192.168.1.100
 Connected to 192.168.1.100.                                                     
 220 kiwi.local FTP server (tnftpd 20040810) ready.                              
 Name (192.168.1.100): ykoya
 331 Password required for ykoya.                                                
 Password:                                                                       
 230-                                                                            
     Welcome to Darwin!                                                          
 230 User ykoya logged in.                                                       
 ftp> cd /etc
 250 CWD command successful.                                                     
 ftp> get motd
 local: motd remote: motd                                                        
 200 PORT command successful.                                                    
 150 Opening ASCII mode data connection for 'motd' (19 bytes).                   
 226 Transfer complete.                                                          
 20 bytes received in 0 secs (0 Kbytes/sec)                                      
 ftp> quit
 221-                                                                            
     Data traffic for this session was 20 bytes in 1 file.                       
     Total traffic for this session was 452 bytes in 1 transfer.                 
 221 Thank you for using the FTP service on kiwi.local.                          
 /mnt/tmp> ls
 motd                                                                            
 /mnt/tmp> cat motd
 Welcome to Darwin!                                                              
 /mnt/tmp> cd /
 /> umount /mnt
USBメモリへ正しくファイルがdownloadできました。

usbfsを使って、各デバイスのdescriptorを表示させてみます。

 /> cat /proc/bus/usb/devices
                                                                                 
 T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=12  MxCh= 1               
 B:  Alloc=  0/900 us ( 0%), #Int=  0, #Iso=  0                                  
 D:  Ver= 1.10 Cls=09(hub  ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1                    
 P:  Vendor=0000 ProdID=0000 Rev= 2.06                                           
 S:  Manufacturer=uClinux 2.6.12-uc0 sl811-hcd                                   
 S:  Product=SL811HS v1.5                                                        
 S:  SerialNumber=sl811-hcd                                                      
 C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  0mA                                          
 I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub               
 E:  Ad=81(I) Atr=03(Int.) MxPS=   2 Ivl=255ms                                   
                                                                                 
 T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=12  MxCh= 4               
 D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1                    
 P:  Vendor=04b4 ProdID=6560 Rev= 0.09                                           
 C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA                                          
 I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub               
 E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=255ms                                   
                                                                                 
 T:  Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#=  4 Spd=12  MxCh= 0               
 D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1                    
 P:  Vendor=08ec ProdID=0011 Rev= 2.00                                           
 S:  Manufacturer=Fujifilm                                                       
 S:  Product=USB Drive                                                           
 S:  SerialNumber=0416830C2E00599A                                               
 C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=178mA                                          
 I:  If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage       
 E:  Ad=81(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms                                     
 E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms                                     
                                                                                 
 T:  Bus=01 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#=  3 Spd=12  MxCh= 0               
 D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1                    
 P:  Vendor=0411 ProdID=0009 Rev= 1.01                                           
 S:  Manufacturer=LUA2-TX                                                        
 S:  Product=BUFFALO LUA2-TX                                                     
 S:  SerialNumber=0009                                                           
 C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=256mA                                          
 I:  If#= 0 Alt= 0 #EPs= 3 Cls=00(>ifc ) Sub=00 Prot=00 Driver=pegasus           
 E:  Ad=81(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms                                     
 E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms                                     
 E:  Ad=83(I) Atr=03(Int.) MxPS=   8 Ivl=128ms                                   
 />                                                                              
よさげです。

こんな小さなボードでも、市販のUSBデバイスが正しく使えているのですから大したものです。今回の実験はひとまずここで終わりです。

続きとしては、USB外付けHDDをつないで大容量のファイルを扱ってみたり、USB無線LANアダプタを使えるようにしてみたり、なんて面白いかなと思っています。

# Redbootがhub経由でUSB storageからkernelをdownloadできるようになるといいんだけど…。

yk@tinywillow.com
《 Workshop Top へ ↑ 》