Howto

Armadillo-460の拡張バスを使ってLANポートを増設する

a460-lan9118 Armadillo-460は拡張バスインターフェース(J1/J2)を持っています。このインターフェースは

  • PC/104拡張バス互換モード
  • ダイレクトCPUバスモード(非同期)
  • ダイレクトCPUバスモード(同期)

の選択が可能で、様々な拡張をおこなうことができます。

本Howtoでは、LAN9118拡張ボードを作成し、ダイレクトCPUバスモード(非同期)に設定したArmadillo-460に接続する方法を説明します。

本Howtoでのおおまかな手順は以下のようになります。

  1. 1. ハードウェア対応
    1. 1.1. Armadillo-460の設定
    2. 1.2. LAN9118拡張ボードの作成
  2. 2. ソフトウェア対応
    1. 2.1. カーネルのソースコードを展開してパッチを適用する
    2. 2.2. ビルド
    3. 2.3. 動作確認

本Howtoで作成するLAN9118拡張ボードの回路図と部品表は以下よりダウンロードすることができます。

本Howtoで使用するソフトウェアは以下の通りです。

ソフトウェアの開発環境にはATDE3を使用します。

Armadillo-460に関連するマニュアルの最新版は、製品マニュアルからダウンロードすることができます。

1. ハードウェア対応

Armarillo-460の設定とLAN9118拡張ボードの作成について説明します。

1.1. Armadillo-460の設定

PC/104 拡張バス電源 V_PC104 は、チップ抵抗(0Ω)の実装を変更することでVIN(+5V)または3.3V_EXT(+3.3V)のどちらかを選択できます。出荷状態のArmarillo-460ではVINが選択されています。ダイレクトCPUバスモードを使用する場合は3.3V_EXTを選択する必要があるので、R270にチップ抵抗(0Ω)を実装します。

拡張バスインターフェースの電気的仕様およびR270の位置については、「Armadillo-400シリーズハードウェアマニュアル」を参照してください。

1.2. LAN9118拡張ボードの作成

LANコントローラにLAN9118(SMSC)を使用した拡張ボードを作成します。以下の回路図を参考にしてください。

a460-custom-circuit-lan9118

ダイレクトCPUバスモード(非同期)ではCS3空間とCS4空間が使用可能ですが、今回はCS3空間を使用します。弊社で作成したLAN9118拡張ボード(本Howto最上部の画像)では、ジャンパによってCS3空間とCS4空間を切り換え可能にしています。

  • RESET信号はActive-Highで入力されるため、論理を反転しています。ソフトウェアの変更でActive-Lowにすることも可能で、その場合反転する回路は不要になります。
  • LAN9118拡張ボードへの電源を、CON21から供給することもできます。その場合、3.3V_EXT消費電流が合計500mA以下になるようにしてください。詳細は、「Armadillo-400シリーズハードウェアマニュアル」を参照してください。

2. ソフトウェア対応

LAN9118拡張ボードに対応したカーネルイメージの作成について説明します。

2.1. カーネルのソースコードを展開してパッチを適用する

[atde ~]$ wget https://download.atmark-techno.com/armadillo-460/source/kernel/linux-2.6.26-at15.tar.gz
[atde ~]$ wget https://download.atmark-techno.com/armadillo-460/sample/linux-a460-lan9118.patch
[atde ~]$ tar zxvf linux-2.6.26-at15.tar.gz
[atde ~]$ cd linux-2.6.26-at
[atde ~/linux-2.6.26-at]$ patch -p1 < ../linux-a460-lan9118.patch

このパッチは、割り込み信号としてIRQ3を使用します。その他の割り込み信号を使用したい場合は、パッチを適用した後に以下のファイルで定義されている".start"と".end"の値を変更してください。

arch/arm/mach-mx25/armadillo460.c

static struct resource ext_smsc9118_resources[] = {
          :
        <省略>
          :
        [1] = {
                .start  = MXC_EXT_INT_BASE + 3,
                .end    = MXC_EXT_INT_BASE + 3,
                .flags  = IORESOURCE_IRQ,
        },
};

".start"と".end"に設定可能な値は、Armadillo-460のCPLDに用意された拡張割り込みコントローラの割り込みを、拡張バスインターフェースの割り込みとして使用するための仮想割り込み番号です。割り込み信号名と割り込み番号の対応は以下の表を参照してください。

信号名 割り込み番号
IRQ3 MXC_EXT_INT_BASE + 3
IRQ4 MXC_EXT_INT_BASE + 4
IRQ5 MXC_EXT_INT_BASE + 5
IRQ6 MXC_EXT_INT_BASE + 6
IRQ7 MXC_EXT_INT_BASE + 7
IRQ9 MXC_EXT_INT_BASE + 9
IRQ10 MXC_EXT_INT_BASE + 10
IRQ11 MXC_EXT_INT_BASE + 11
IRQ12 MXC_EXT_INT_BASE + 12
IRQ14 MXC_EXT_INT_BASE + 14
IRQ15 MXC_EXT_INT_BASE + 15

MXC_EXT_INT_BASEは、仮想割り込み番号のベースを表すマクロです。 include/asm-arm/arch-mxc/hardware.hで定義されており、値は192です。

2.2. ビルド

前項で適用したパッチには、armadillo460_smsc9118_defconfigが含まれているので、
それを用いて設定を行います。

[atde ~/linux-2.6.26-at]$ make armadillo460_smsc9118_defconfig
[atde ~/linux-2.6.26-at]$ make CROSS_COMPILE=arm-linux-gnueabi-
      :(ビルドには数分かかります)
[atde ~/linux-2.6.26-at]$ gzip -c arch/arm/boot/Image > linux.bin.gz

armadillo460_smsc9118_defconfigによって設定される、i.MX257のWireless External Interface Module(WEIM)レジスタの値の決定方法については、「ap.1. バスタイミングの設定」を参照してください。

ソフトウェアマニュアルを参照し、新しい Linux カーネルイメージ(linux.bin.gz)を Armadillo-460 に書き込んでください。

2.3. 動作確認

Armadillo-460に電源が入っていないことを確認してから、JP5をショートしたLAN9118拡張ボードを接続してください。

作成したLinuxカーネルイメージをArmadillo-460に書き込み、再起動します。
起動ログには、以下のようにLAN9118拡張ボードを認識したことが表示され、ネットワークインターフェースeth1が割り当てられたことが確認できます。

smsc911x: Driver version 2008-10-21.
smsc911x-mdio: probed
eth1: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0:01, irq=-1)
net eth1: MAC Address: 9e:95:79:1d:b0:a9

ログインして、ネットワークの設定をおこないます。以下の例ではdhcpに設定しています。ネットワーク設定の詳細については「Armadillo-460ベーシックモデル開発セットスタートアップガイド」を参照してください。

[root@armadillo460-0 (ttymxc1) ~]# vi /etc/config/interfaces
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
 
auto lo eth0
iface lo inet loopback
iface eth0 inet dhcp
iface eth1 inet dhcp
[root@armadillo460-0 (ttymxc1) ~]# flatfsd -s

ネットワークインターフェースeth1を活動状態にします。ネットワーク通信にeth0が使用されないように事前に休止状態にしておきます。

[root@armadillo460-0 (ttymxc1) ~]# ifdown eth0
[root@armadillo460-0 (ttymxc1) ~]# ifup eth1
udhcpc (v0.9.9-pre) started
Sending discover...
Sending select for 172.16.2.127...
Lease of 172.16.2.127 obtained, lease time 86400

以上で設定は完了です。PCから以下のようにコマンドを実行するとネットワークの疎通を確認することができます。

[atde ~]$ ping 172.16.2.127 -c 3
PING 172.16.2.127 (172.16.2.127) 56(84) bytes of data.
64 bytes from 172.16.2.127: icmp_req=1 ttl=64 time=0.246 ms
64 bytes from 172.16.2.127: icmp_req=2 ttl=64 time=0.255 ms
64 bytes from 172.16.2.127: icmp_req=3 ttl=64 time=0.266 ms
 
--- 172.16.2.127 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.246/0.255/0.266/0.020 ms
[atde ~]$

付録A バスタイミングの設定

Armadillo-460のダイレクトCPUバスモード(非同期)ではi.MX257のWireless External Interface Module(WEIM)レジスタの値を指定し、バスタイミングを設定することができます。 バスタイミングは、LAN9118のバスタイミングに合わせますが、Armadillo-460の遅延を考慮する必要があります。

A.1. LAN9118のタイミング

LAN9118のタイミングは以下の通りです。

  • リード時

lan9118_read

記号詳細min(ns)max(ns)
tcycleリードサイクル時間45
tcslCS、OEパルス幅32
tcshCS、OEディアサート時間13
tasuアドレスのセットアップ時間0
tahアドレスのホールド時間0
tcsdvデータの出力までの時間30
tdohデータのホールド時間0
  • ライト時

lan9118_write

記号詳細min(ns)max(ns)
tcycleライトサイクル時間45
tcslCS、RWパルス幅32
tcshCS、RWディアサート時間13
tasuアドレスのセットアップ時間0
tahアドレスのホールド時間0
tdsuデータのセットアップ時間7
tdhデータのホールド時間0

A.2. Armadillo-460の遅延

Armadillo-460のCPU(i.MX257)と入出力ピン(J1、J2)の間には CPLD とバッファを配置しているため遅延が生じます。また、バッファイネーブルの反映までの時間も大きく影響します。詳細については「Armadillo-400シリーズハードウェアマニュアル」を参照してください。

  • ダイレクトCPUバスモード(非同期)の遅延
信号名 CPLDによる遅延 Bufferによる遅延
min(ns) max(ns) min(ns) max(ns)
CS3 - 7.6 1 7.4
OE - 11.9 1 7.4
RW - 11.9 1 7.4
SA(アドレス) - - 1 7.4
SD(Armadilloから出力するデータ) - - 1 7.4
SD(Armadilloへ入力するデータ) - - 0.7 7.4
  • バッファイネーブル反映までの時間
CS3からイネーブルまでArmadilloから出力時Armadilloへ入力時
max(ns)max(ns)max(ns)
7.823.712.6

A.3. バスタイミングの決定

LAN9118のバスタイミングとArmadillo-460の遅延の最大値を考慮した場合のバスタイミングは以下のとおりです。

記号説明設定値設定可能値備考
WSC アクセルサイクル時間 8 0~62 (WSC+1)×7.5=67.5 (ns)
OEA OEアサートタイミング 1 0~15 OEA×3.75=3.75 (ns)
OEN OEディアサートタイミング 3 0~15 OEN×3.75=11.25 (ns)
CSA CSアサートタイミング 1 0~15 CSA×3.75=3.75 (ns)
DSZ データ幅 5 0~7 3: 8bit、5: 16bit
CSN CSディアサートタイミング 3 0~15 CSN×3.75=11.25 (ns)
CSEN チップセレクトイネーブル 1 0、1 1:イネーブル 0:ディスエーブル
RWA RWアサートタイミング 1 0~15 RWA×3.75=3.75 (ns)
RWN RWディアサートタイミング 30~15 RWN×3.75=11.25 (ns)
CNC1 CSディアサート時間(bit2,1) 1 0~7 (CNC+1)×7.5=15 (ns)
CNC2 CSディアサート時間(bit3)
EW DTACKモードセレクト 1 0、1 1:レベル 0:エッジ

以上より、WEIMレジスタの値は次のようになります。

  • CSCR3U
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
SP WP BCD BCS PSZ PME SYNC DOL CNC WSC EW WWS EDC

CNC=1、WSC=8、EW=1より0x00004880です。

  • CSCR3L
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OEA OEN EBWA EBWN CSA EBC DSZ CSN PSR CRE WRAP CSEN

OEA=1、OEN=3、CSA=1、DSZ=5、CSN=1、CSEN=1より0x13001531です。

  • CSCR3A
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
EBRA EBRN RWA RWN MUM LAH LBN LBA DWW DCT WWU AGE CNC2 FCE

RWA=1、RWN=3より0x00130000です。

各レジスタの詳細については付属DVDの/document/datasheet ディレクトリに収録されている「i.MX25 Multimedia Applications Processor Reference Manual」を参照してください。