« CE6 で iPhoneToday | トップページ | EKEN M001 とイーモバイル D02HW »

2010年12月 6日 (月)

Windows CE6で動く PL2303 USBシリアルドライバ

ネットで探すとなぜかソースがある。

PL2303_WinCE_Driver Sourcecode:
http://www.hackchina.com/dlpre.php?lang=en&id=141923

マイクロソフトがサンプルで提供しているUSBSER.DLLをPL2303用として拡張している感じ。

CE6 Platform Builder でビルドしたものをここに置いておきます。

「USBSER_PL2303.zip」をダウンロード

■インストール方法
 ①USBSER.DLLは、Windowsフォルダへコピーしてください。
 ②USBSER.REGは、RegEditでインポートしてください。

■ほんとに、このドライバは大丈夫?

入手元がはっきりしないので、いろいろ調べてみた。

①レジストリと動作の関係

レジストリを調べると、どうやらこのドライバは3種類のドライバ共用になっている。

どうやって3種類の動きを決めているかというと、レジストリの中のDeviceArrayIndexで行っている。

レジストリの中は、以下のようになっており、

            (ベンダーID, プロダクトID)
DeviceArrayIndex = 0 ...(1118,206)
DeviceArrayIndex = 1 ...(1118,121)
DeviceArrayIndex = 2 ...(1659,8963)

USB接続時に所定のベンダーID, プロダクトIDからUSBSER.DLLがロードされて、所定のDeviceArrayIndex の値を拾って処理を分けている。

これらのベンダID, プロダクトIDの値を16進数に変換して調べると

10進数 = 16進数
1118,206 = 0x045e,0xce
1118,121 = 0x045e,0x79
1659,8963 = 0x067b,0x2303

になり、USBデバイス一覧サイト(http://www.linux-usb.org/usb.ids)からみると

ベンダーID = 0x045e、プロダクトID(0xce, 0x79)は、マイクロソフト製の製品
ベンダーID = 0x067b、プロダクトID(0x2303)は、ProlificのPL2303対応の製品

となっている。

CE6 Platform BuilderにあるサンプルソースUSBSER.DLLのレジストリでは、DeviceArrayIndex=0,1になっており、これは、それにDeviceArrayIndex=2を追加した形になっている。従来の仕様も存在し、安心できる仕様になっている。

②コーディングについて

usbdev.cppをみると、CreateSerialObject()の中で

else if (DeviceArrayIndex == 2) {
   pSerialPDD= new UsbPl2303SerialClientDriver(lpActivePath,pMdd, pHwObj);
   if (pSerialPDD && !pSerialPDD->Init()) {
     delete pSerialPDD;
     pSerialPDD = NULL;
   }
}

てな感じで、DeviceArrayIndexの値に応じてそれぞれのクラスを呼び出している。

CE6 Platform BuilderにあるサンプルソースUSBSER.DLLでもこの形をとっており、

①UsbActiveSyncSerialClientDriver()
②UsbSerClientDriver()
③UsbPl2303SerialClientDriver()

と、③のPL2303用(UsbPl2303SerialClientDriver)を追加で定義している。

でこのクラスであるが、

1) コンストラクタ
2) ::Init()
3) ::SetBreak
4) ::Pl2303VendorRead
5) ::Pl2303VendorWrite

の記述が行われており、4)::Pl2303VendorRead 5) ::Pl2303VendorWriteは、::Init()の中でしか呼び出していないため、他のドライバとの違いは、SetBreak()だけという感じ。

また、よくソースをみると ::Init()の中で

if(lpTargetUsbDevice->Descriptor.bDeviceClass == 0x02)
 m_dwHwType = PL2303_TYPE_0;
else if(lpTargetUsbDevice->Descriptor.bMaxPacketSize0 == 0x40)
 m_dwHwType = PL2303_TYPE_HX;
else if((lpTargetUsbDevice->Descriptor.bDeviceClass == 0x00) || (lpTargetUsbDevice->Descriptor.bDeviceClass == 0xFF))
 m_dwHwType = PL2303_TYPE_1;

となっており、Linuxのpl2303.cとロジックが酷似している。かなり大丈夫なドライバではないかと思う。

※メモ
・2010/12/10 カーネルモードかユーザーモードか指定していなかったので修正しました。

|

« CE6 で iPhoneToday | トップページ | EKEN M001 とイーモバイル D02HW »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/531329/50230953

この記事へのトラックバック一覧です: Windows CE6で動く PL2303 USBシリアルドライバ:

« CE6 で iPhoneToday | トップページ | EKEN M001 とイーモバイル D02HW »