2007/10/05 初版
2008/01/03 レジストリで速度とmac addressを設定できるようにしたものを公開
2008/01/10 レジストリで速度とmac addressを設定できるもののsigmarion3用を公開

BUFFALO LUA-KTX / REALTEK RTL8150 driver on W-ZERO3es & sigmarion3

WZERO3esとsigmarion3をUSB−LANアダプタで有線LANに接続するためのデバイスドライバを作りました。
これでW−ZERO3esを母艦PC無しで有線LAN接続できるようになります。
※10/7 アドエスでも動くことを確認していただきました。→W-ZERO3 ツールMEMO

他のWindowsMobile機やWindowsCE機でも使えるかどうかはわかりません。
動作報告募集中(この機種で動いた/動かん/LUA-KTX以外のRTL8150使用アダプタの存在など)

USB−LANアダプタは バッファロー(旧メルコ)LUA−KTX とOEM元のREALTEK RTL8150に対応しています。
別途、USB変換ケーブル(ミニAプラグ−標準Aレセクタブル)が必要です。
USB1.1にしか対応してない分、消費電力が小さいようで、給電付きハブを噛まさなくても動きます。

ダウンロード

WZERO3es用←EM・ONE、DELL x51vで動いたとの報告あり(EM・ONEは動かなかったと言う報告もあり)10/16現在
RTL8150Driver_WM.CABをWZERO3esに持って行き、タップします。
デバイスにインストールして、LUA−KTXを接続すれば使えます。

sigmarion3用
RTL8150.dllをsigmarion3のWindowsフォルダにコピーし、LUA−KTXを接続します。
デバイスドライバ名を聞かれたら RTL8150.dll と入力。必要なレジストリキーが登録され、使えるようになります。
有線LANからWEBを見るには、[インターネットオプション]→[接続]の「LANを使用」にチェック。
つないだまま電源OFFしてしまうとその後リセットしないと動かない問題があります。

接続名はどちらも「USBLAN RTL8150」としています。
mac address はレジストリを設定しなければLUA−KTXのEPROMのものが使われます。
1台のWZERO3/sigmarion3にUSBハブを使って複数のLUA−KTXを接続することはできません。

レジストリ設定 2008/1/3追記

HKEY_LOCAL_MACHINE\Comm\\RTL81501\setBMCR (DWORD)
 1にすると次のBMCRの値が使用されます。0ではBMCRの設定をしません。EPROMの値が使われます。(工場出荷値=オートネゴジェーション)

HKEY_LOCAL_MACHINE\Comm\\RTL81501\BMCR (DWORD)
 Bit15 1:ハードリセットする 0:しない
 Bit13 1:100Mbps 0:10Mbps
 Bit12 1:オートネゴジェーション、Bit13、Bit9の設定を無視する 0:Bit13、Bit9の設定を使用する
 Bit9 1:FullDuplex 0:HalfDuplex
 その他のBitは不使用

HKEY_LOCAL_MACHINE\Comm\\RTL81501\MACaddress (BINARY)
 6バイトのバイナリ値を設定すると、mac addressとしてセットされます。

作った経緯

WZERO3es買って、有線でLANにつなぎたかったのでUSBLANアダプタで一番コンパクトだったLUA−KTXを買ってつないでみる。が、まったく認識せず動かず。
 ↓
バッファローのサイトにWindowsMobile用のドライバ無し。REALTEKのサイトからWindowsCE用のドライバを落として突っ込んでみるがやっぱり動かず。
 ↓
いろいろ調べてみる。WindowsMobileにはNDIS.DLLが入って無いのか?→隠しファイルで標準のエクスプローラでは見えないだけと後で知る。
 ↓
CQ出版の本にLUA−TX(AN986)用のドライバのソースが収録されているのを見つけたので、それをまずLUA−KTX用に改竄。
 ↓
それをWindowsMobileに移植。数ヶ月かかって完成にこぎつける。

プログラムの大まかな流れ

sigmarion3用では初めてLUA−KTXが接続されたときに、USBInstallDriver()が呼び出されるので、必要なレジストリを登録する。
WZERO3es用は.CABファイルでインストールするときにレジストリが登録される。

LUA−KTXが接続されると、レジストリ値
 HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\1041_18\Default\Default\LUA-KTX\Dll =RTL8150.dll
に基づいて RTL8150.dll の USBDeviceAttach()が呼ばれるので、渡されたUSBハンドルなどを保存しておく。

そこから、NdisRegisterAdapter()を呼んでNDISに新しいネットワークアダプタが接続された事を通知する。
 *WindowsCE.NET4.0以降で可能

すると、NDISがレジストリ値
 HKEY_LOCAL_MACHINE\Comm\\RTL8150\ImagePath =RTL8150.dll
に基づいて RTL8150.dll の DriverEntry()を呼び返してくれるので、ここから仕事を始める。

・・・省略・・・

LUA−KTXが抜かれると、USBDeviceNotify()を呼んでくれるようにUSBDeviceAttach()の中で登録してあるので、USBDeviceNotify()が呼ばれたらNdisDeregisterAdapter()でNDISにネットワークアダプタが外された事を通知する。

するとNDISがHaltHandlerに登録してある関数ktx_Halt()を呼び返してくれるので、後始末をする。

コンパイル環境

ソースは共通にしてありますが、WZERO3es用はVisualStudio2008β2版で、
sigmarion3用はeMbeddedVisualC4.0sp4にMicrosoft POCKET PC 2003 SDKを追加してコンパイルしてます。
と言うのも、VisualStudio2008β2にはWindows Mobile 5.0 SDK R2が入っているのでWZERO3es用は作れるのですが、
STANDARDSDKが無いのでsigmarion3用にはコンパイルできませんでした。
またSTANDARDSDKだけだと足りないヘッダファイルがあるので、POCKET PC 2003 SDKのものを一部流用してます。
プラットホームビルダーは無くても大丈夫でした。

参考資料というかパクリ元

CQ出版 USBハード&ソフト開発のすべて―USBコントローラの使い方からWindows/Linuxドライバの作成まで 第10章
小松平良樹プレゼンツ ADMTEK AN986 device driver, NDIS miniport driver on Sigmarion2
REALTEK RTL8150のデータシート
あとMSDNライブラリとか