WiFi with H8 (2004)

秋月電子通商 AKI-H8LAN ボードに無線 LAN CF (Compact Flash) カードを接続し、 無線 LAN (IEEE802.11b, WEP 128 bit 対応)、TCP/IP で双方向通信する。

ラジコン(一方向通信)、リモートセンシング、リモートコントロールなどを、 少ないハードウェア資源で TCP/IP (双方向) 通信に置き換えることが狙い。 H8 で直接、無線 LAN カードを制御するので、USB コントローラや、10Base-T/802.11b ブリッジなどは不要。 既に制御系でH8を使っている場合は、マイコンの追加が不要。 ラジコンの通信チャンネルの不足問題も IPv4 で解決できる?

H8 のバスには 16 Mbit DRAM, 10Base-T Ethernet コントローラ (RTL8019AS), CF カードを接続。 OSとして uClinux が動作。PCMCIA 無線 LAN カードのデバイスドライバを移植した。 実績のある Linux の TCP/IP プロトコルスタックを使った通信が可能。 PCでのネットワークプログラミングで一般的なソケットインタフェースを使い、 通信プログラムを開発できる。

We made the "wlan-h8" system composed of the AKIZUKI AKI-H8LAN board connected a wireless LAN Compact Flash (CF) card. It can communicate with TCP/IP on the wireless LAN (IEEE802.11b, WEP 128bit)
The objective is the replacements for radio control, remote sensing or remote control and so on with smaller hardware resources. Since a H8 MCU controls the CF card directly, a USB controller or a 10Base-T/802.11b bridge is not required. If the system has already loaded H8 as a controller, you do not need to add an additional micro controller for the wireless LAN. It may be also a solution for the shortage of channels in a radio control.
A 16 Mbit DRAM, a 10Base-T Ethernet controller (RTL8019AS) and a CF card are connected to the H8 external buses. We are utilizing uClinux as a operating system (OS) and have ported a PCMCIA wireless LAN card device driver. It enables to communicate by using a reliable TCP/IP protocol stack of Linux. Programmers are able to develop network programs with the socket interface, that is a common API as the network programming on UNIX.

Hardware

Circuit, Parts

回路図 (schematics) h8-cf-2.2.ce3.png

ChangeLog
Jul 8, 2004
H8:~IRQ4 - CF:HIREQ-
Feb 8, 2005
CF:IREQ -> CD:-IREQ 極性修正
配線表 (line assigment table) assign.h8-cf.txt (追加 H8:~IRQ4 - CF:HIREQ-)
Aug 5, 2006
H8:D0-7 -> H8:D8-15

AKI-H8LAN (AE3068)

H8/3069F 20MHz; Flash ROM 512kByte, RAM 16kByte, memory mapped I/O
DRAM 16M-DRAM(HM57117800TT-6) 16Mbit(2MByte)
Ethernet Controller RTL8019AS

H8/3069F (mode 5) address space
0x000000 vector table, ROM
0x200000 area1 ~CS1 RTL8019AS (NE2000)
0x400000 area2 ~CS2 DRAM (16Mbit)
0x600000 area3 ~CS3 CF Card (attribute memory space)
0x800000 area4 ~CS4 CF Card (I/O space)
0xFEE000 I/O Register(1), RAM, I/O Register(2)

WLI-CF-S11G (MELCO Wireless LAN CF Card)

最大消費電力 (Power consumption max) 660mW (3.3V * 0.2A)
Intersil PRISM2.5 ISL3873B (fn8019.pdf) Integrated MAC and Baseband Processor for PCMCIA and USB
melco.dump_cis.log (dump_cis on Linux)
CISTPL_DEVICE, CISTPL_DEVICE_A, CISTPL_DEVICE_OA telco.cis.dev.png
CISTPL_CONFIG, CISTPL_CFTABLE_ENTRY melco.cis.cfg.png

8bit data bus 接続 (connection) (ISL3873B fn8019.pdf p.13)
bus access: bus.png
HD[15:0]
ホストインタフェースはワードアクセスを第1に設計されているが、すべての バイトアクセスモードも完全にサポートされいてる。詳細は次のHCE01-, HCE2-の項を見よ。なお、attribute memory空間は偶数バイトアクセスのみの 仕様になっている。

HCE1-, HCE2-
PC Cardのサイクルタイプとサイクル幅をCE信号とともに制御する。 PC Card standardに準拠したHCE1-とHCE2-、HA0の組合せを使用することによ り、ワードとバイトアクセスがサポートされている。

3.3V レギュレータ (regulater)

東芝 低ドロップ三端子レギュレ−タ TA48M033F(S)
正出力 +3.3V, 0.5A 面実装(DPAK) 千石100円

CF Card reset 回路 schematics (CF::RESET)

R: 10kohm, C: 10uF
TC74HC14: Toshiba 74HC14 Hex schmitt inverter

PCIC (PC Card Interface Controller)

TC74HC32: Toshiba 74HC32 Quad 2-Input OR Gate
TC74HC08: Toshiba 74HC08 Quad 2-Input AND Gate

Sunhayato CK-14 (CF -> Universal 変換基板 translation board)

PCB (Print Circuit Board)

version 2
h8-cf-2.pcb

h8-cf-2.jpg
ChangeLog: rotate CK-14 (CF), CF::RESET, CF::-CE1 = (H8:-CS3)&(h8::-CS4), 74HC32::Vcc=3.3V -> 5.0V

version 1
h8-cf.pcb, h8-cf.png

PCB CAD
PCB http://bach.ece.jhu.edu/~haceaton/pcb/
Eagle http://www.cadsoft.de/

Waveforms

NE2000, DRAM, CF attribute, CF I/O を一度 memory dump した後、C Fを Software Reset し再び memory dump するプログラム。 monitor 上での実行用と uClinux 上の userland program としての実行用の2種類を含む。
dump.tar.bz2

$ tar jxf dump.tar.bz2 
dump/ (monitor上での実行用)
dump/3069s.h
dump/Makefile
dump/crt0.s (start up routine)
dump/h83069Fmon.x (Renesas monitor (DRAM利用)用 linker script)
dump/h83069Fredboot.x (redboot用linker script)

dump/h83069From.x (ROM化用linker script)
dump/dump.c
dump/sci.c (SCI driver)
dump/sci.h (SCI driver)
dump/monitor.mot (Renesas monitor (内蔵RAM利用))
dump/h83069Flmon.x (Renesas monitor (内蔵RAM利用)用 linker script)
dump/dump.log (RedBootでの実行結果)

dump/linux/ (uClinuxのuserland programとして実行)
dump/linux/Makefile
dump/linux/3069s.h
dump/linux/dump.c (printf()を利用。他のresource(OSが利用)へのアクセスを避ける)
dump/linux/dump.failed.log (elf2flt-wlanh8.diffを当てる前のアクセスエラーlog)
dump/linux/crt0.S
dump/linux/dump.crt0_ram.patch.log (crt0_ram.S.diffを当てた後。正常値)
$ cd dump; make (dump.mot (Motorola S format)が生成)
$ minicom
RedBoot> load -v -m TFTP -b 0x400000 dump.mot; go 0x400000
$ cd linux; make (dump (BINFLT)生成、ROMFS (NFS)にして実行)

$ minicom
RedBoot> load -r -m TFTP -b 0x400000 aki3068net-image.bin
RedBoot> exec -c "console=ttySC1,38400n81"
/> /usr/dump
WLI-CF-S11G (BUFFALO wireless LAN CF Card)

電源投入直後 (reset回路 C=10uF, R=10kohm)
Vcc, CF::RESET reset.png
74HC14::2A(In) (RC), CF::RESET rc.png
CF::RESET, CF::-HIREQ hireq.png

RESET (ISL3873B fn8019.pdf p.14)

RESETがde-assertされたときに、CISテーブルが初期化され、初期化を完了す るとHIERQ-がhighになる(リセット直後はHIREQ-はRDY/BSYのようにふるまい、 そして、カードの利用準備ができることを示すhighになる)。CISテーブルは Flashメモリに入っていて、ファームウェアの初期化中にRAMにコピーされる。 ホストシステムはCIS情報を読み、コンフィグレーションレジスタに書き込む ことで、カードを初期化することができる。

read attribute space (dump.c) (3 state 3 wait)
CF::-WAITも観測 waitcf.png
CF::-WAITも観測 without CF waitnocf.png
CF::-OE, -WEをアナログで観測(ロジック観測波形に重ね合わせ) analogplus.png
CF::-OE, -WEをアナログで観測(アナログ信号のみ) analogonly.png

read attribute space (dump.c) (3 state, 3 wait, enable BSC.BCR.WAITE)
melco.dump.log melco.dump.png waiteff.png waitexx.png
melco.dump_cis.log (dump_cis on Linux)

Epson memory-mode CF Card (SunDisk)

read attribute space (dump.c) (? state ? wait)
epson.dump.log epson.png
epson.dump_cis.log (dump_cis on Linux)

Software

Cross development environment (h8300-elf)
binutils-2.14
$ tar zxvf binutils-2.14.tar.gz
$ cd binutils-2.14
$ ./configure --target=h8300-elf
$ make
# make install
gcc-3.3
$ tar zxvf gcc-3.3.tar.gz
$ cd gcc-3.3
$ patch -p1 < ../gcc-3.3.diff
$ ./configure --target=h8300-elf \
 --with-newlib \
 --with-headers=$HOME/download/newlib-1.11.0/newlib/libc/include \
 --enable-languages='c'
$ make
# make install
elf2flt

http://keihanna.dl.sourceforge.jp/uclinux-h8/5236/elf2flt.patch
に加え、CF Cardの領域(attribute空間 (, I/O空間))にuserlandから書き込みを許可するためにpatchが必要 (device driverで叩く分には必要なさそうですが)。
この2つの修正を含んだ elf2flt (Jan 14, 2004のCVS)に対する patch elf2flt-wlanh8.diff
このpatchを当て済みのパッケージ elf2flt-wlanh8.tar.bz2

$ tar jxvf elf2flt-wlanh8.tar.bz2
$ cd elf2flt-wlanh8
$ ./configure --target=h8300-elf --with-libbfd=/usr/local/lib \
 --with-bfd-include-dir=/usr/local/include \
 --with-binutils-include-dir=$HOME/download/binutils-2.14/include
$ make
# make install
Boot Loader (Debug Monitor)
eCos, RedBoot

uClinuxのbootに必要
eCos-h8 [sourceforge.jp]
eCos [redhat.com]
RedBoot [redhat.com]

Hitachi Monitor

テスト用に利用。運用時には不要。
http://www.mechatronics.mech.tohoku.ac.jp/~kumagai/tech/h8/ の「モニタをなんとかする」を参考にしました。
AKI-H8LAN (H8/3067?, 3068, 3069)用 内蔵RAMにprogramをload (DRAM未使用)

akih8mon.bat
monitor.aki
monitor.MOT
h83069Flmon.x (linker script for GNU ld (h8300-elf))
OS

uClinux-h8 [sourceforge.jp]
uClinux [www.uclinux.org]
通常の構築、利用方法は別ページ掲載中 uClinux for H8/300H

wlan-h8での構築方法
H8MAX用のpackageを利用 http://strawberry-linux.com/h8max/

$ tar jxvf uClinux-dist-h8300.tar.bz2
$ cd uClinux-dist-h8300
$ patch -p1 < wlanh8.diff
linux-2.4.x/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S: 
 area3,4をCF用bus timingに設定
linux-2.4.x/drivers/net/wireless/Config.in:
 orinoco_wlanh8.cを追加 (make *config用)
linux-2.4.x/drivers/net/wireless/Makefile:
 orinoco_wlanh8.cを追加
linux-2.4.x/drivers/net/wireless/orinoco_wlanh8.c:
 orinocoのwlan-h8ボード用wrapper
linux-2.4.x/include/asm-h8300/io.h:
 16bit read writeを8bitに分ける
$ make menuconfig
    (Akizuki/aki3068net) Vendor/Product
    (linux-2.4.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)
    kernelの設定
 Network device support
  [*] Wireless LAN (non-hamradio)
  [*]   Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)
  [*]     Wlan-h8 support (EXPERIMENTAL)
 というようにwlan-h8基板用の設定がでるのでonにする。
        その他は面倒なので $ grep =y linux-2.4.x/.config
        CONFIG_UCLINUX=y
        CONFIG_UID16=y
        CONFIG_RWSEM_GENERIC_SPINLOCK=y
        CONFIG_EXPERIMENTAL=y
        CONFIG_BOARD_AKI3068NET=y
        CONFIG_H83068=y
        CONFIG_RAMKERNEL=y
        CONFIG_CPU_H8300H=y
        CONFIG_NET=y
        CONFIG_KCORE_ELF=y
        CONFIG_BINFMT_FLAT=y
        CONFIG_DEFAULT_CMDLINE=y
        CONFIG_BLK_DEV_BLKMEM=y
        CONFIG_NOFLASH=y
        CONFIG_INET=y
        CONFIG_NETDEVICES=y
        CONFIG_NET_ETHERNET=y
        CONFIG_NET_ISA=y

        CONFIG_NE2000=y
        CONFIG_NET_RADIO=y
        CONFIG_HERMES=y
        CONFIG_WLANH8_HERMES=y
        CONFIG_NET_WIRELESS=y
        CONFIG_SH_SCI=y
        CONFIG_SERIAL_CONSOLE=y
        CONFIG_RAMFS=y
        CONFIG_PROC_FS=y
        CONFIG_ROMFS_FS=y
        CONFIG_NO_KERNEL_MSG=y
        CONFIG_ZLIB_INFLATE=y
    userlandの設定 (RAMがぎりぎりなので、なるべくダイエット)
 busyboxを使う (default)
  shutdown, rebootなどは削除 (IDE (CF)無しなのでいい?)
 iwconfig (wireless_tools) busyboxではなく単体のバイナリ
  Network Applications
  --- Wireless-tools
   [*] wireless_tools support
   [*] iwconfig
$ make dep
$ make clean
$ LANG=C make
Wireless LAN Device Driver

linux-2.4.x/drivers/net/wireless/orinoco_wlanh8.c
上記(OS)のpatch (wlanh8.diff)に含まれている。

network interfaceは
eth0: RTL8019AS
eth1: WLI-CF-S11G

orionco_plx.cから移植。
orinoco_plx.cはPCMCIA slotを持つPCI bus card。 PCMCIA slotに無線LAN PCカードを挿入して使われる。 orinoco_plx.cからorinoco.c, hermes.cと順に呼ばれる。

Prism chipsetのdevice driverについて情報収集した資料 driver.txt

Instructions for running

利用方法。
生成された kernel & userland image (image/aki3068net-image.bin) を TFTP serverに配置

$ minicom
RedBoot> load -r -v -m TFTP -b 0x400000 aki3068net-image.bin
RedBoot> exec -c "console=ttySC1,38400n81"
(uClinux-H8 boot 略)

/> free
/> ifconfig eth0 172.21.27.21 netmask 255.255.255.0
/> ping 172.21.27.48
/> iwconfig eth1 essid 'hoge' key s:wep_key_string
/> iwconfig
/> ifconfig eth1 163.221.183.73 netmask 255.255.255.0
/> ping 163.221.183.48
/> cat /proc/net/dev
/> route
/> cat /proc/kmsg

(略)
<7>orinoco.c 0.13b (David Gibson  and others)
<7>hermes.c: 4 Dec 2002 David Gibson 
<7>orinoco_wlanh8.c (OKAZAKI Atsuya )
<7>orinoco_wlanh8: CIS: 01:03:00:00:FF:17:04:67:
<7>Detected Orinoco/Prism2 wlan-h8 device at irq:16, io addr:0x800000
<7>eth1: Station identity 001f:0004:0001:0003

<7>eth1: Looks like an Intersil firmware version 1.3.4
<7>eth1: Ad-hoc demo mode supported
<7>eth1: IEEE standard IBSS ad-hoc mode supported
<7>eth1: WEP supported, 104-bit key (と言われるが、128bitで使えた)
<7>eth1: MAC address 00:07:40:0F:15:6B
<7>eth1: Station name "Prism  I"
<7>eth1: ready
(略)
<6>eth1: New link status: Connected (0001)

/etc/rc (romfs/etc/rc) に書けば起動時に実行される。
RedBootもscriptを埋め込み、自動でTFTPからバイナリを読み込み、bootすることが出来る(らしい)。
inflate_boot [sourceforge.jp] を使えば、ROM化、standalone運用も出来る(らしい)。

PCMCIA for Linux

Host PC (Linux) での PCMCIA 関連情報
Linux PCMCIA [sourceforge.net]

/sbin/dump_cis
    dump_cis - display PCMCIA Card Information Structures
    # /sbin/dump_cis -v > melco.dump_cis.log
/sbin/pack_cis
    pack_cis - compile PCMCIA Card Information Structures
/sbin/cardinfo
    cardinfo - PCMCIA card monitor and control utility for X
/sbin/cardctl
    cardctl - PCMCIA card control utility
/sbin/cardmgr
    cardmgr - PCMCIA device manager
WLI-CF-S11G on Debian GNU/Linux (woody)

Host PC (Linux) で WLI-CF-S11Gを使う方法。

# apt-get install kernel-image-2.4.18-bf2.4
# apt-get install pcmcia-modules-2.4.18-bf2.4
(reboot)
# modconf
# vi /etc/pcmcia/config
card "BUFFALO WLI-CF-S11G"
  version "BUFFALO", "WLI-CF-S11G"
  bind "orinoco_cs"
を追加
# /etc/init.d/pcmcia restart
# apt-get install wireless-tools
# iwconfig eth0 essid 'hoge' key s:wep_key_strings

An application example: NTP Clock

NTP Clock (PICNIC) の無線LAN対応版
原子時計に繋がったNTP server (ntp3.jst.mfeed.ad.jp) からtimestampを取得し、LCDに表示。

H8にcharacter LCDを接続。pin aasignは右図の通り。
プログラムはUDP/IP ネットワークプログラムとLCD制御プログラムから成る。 デバイス依存(LCD)以外の部分をHOST PC (Linux) で開発しておき、 最後にクロス開発環境(h8300-elf)でデバイス依存のコードを追加した。

$ tar jxvf ntp.tar.bz2
ntp/
ntp/Makefile
ntp/lcd.c (LCD driver in userland)
ntp/lcd.h
ntp/3069s.h
ntp/lcd.lb3 (回路図 LCD library for qbsch)
ntp/lcd.ce3 (回路図 for qbsch)
ntp/ntp.c (main routing)

ntp/lcd.png (回路図 png)
ntp/linux/ (HOST PC (Linux)上でのテスト開発用)
ntp/linux/ntp.c
ntp/linux/Makefile
$ vi Makefile (DIST=書き換え)
$ make

生成されたntp (flt binary) をuClinux-dist-h8300/romfs/usr/に入れ、 uClinux-dist-h8300以下でimageを生成 ($ make image)。 以降、上記(Instructions for running)手順と同様。

/> iwconfig eth1 essid 'foo' key s:wep_key_strings
/> ifconfig eth1 163.221.183.73 netmask 255.255.255.0
/> route add default gw 163.221.183.1
/> /usr/ntp 210.173.160.87 (ntp3.jst.mfeed.ad.jp)

unsigned int sleep(unsigned int seconds);で1秒を生成しているので、正確な1秒ではない。 RAM容量がぎりぎりなので、romfsのサイズを小さくするため、*printf()perror()は除いた。

Reference

Staff

  • OKAZAKI Atsuya
  • TOGAWA Satoshi
    s-togawa at tkd.att.ne.jp