PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.10 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆C++でUSB(HID)アクセスプログラムを作成 PIC側のプログラムはC18コンパイラを使わずPICアセンブラで作成しますが、パソコン側のUSB(HID)アクセスプログラムはBorland C++コンパイラで作成します。 しかしこれがまた難物で悪戦苦闘の連続でありました。 |
[第49回]
●XPでもUSBマウスが検出できました
[第47回]で、WindowsXPではCrearFile関数でUSBマウスの検出に失敗してしまいます、ということを書きました。
そうしましたら、メールをいただきました。
こちらのページ(http://noritan-micon.blog.so-net.ne.jp/2008-04-07)に書いてありますよ、と教えていただきました。
さっそく訪問させていただきました。
そのページのずっと下の、終わりに近いところに、
c)システムデバイス
と書いてあって、そこにUSBマウスとUSBキーボードについてのコメントがあります。
そのところを一部引用させていただきます。
[以下引用](原文のまま)
Windows はマウスとキーボードをシステムデバイスとして、直接のアクセスを制限します。
(一部省略)
キーボードとマウスに対するCreateFileは、次のパラメータで開けます。
CreateFile()
- dwDesiredAccess = 0
- dwDesiredAccess = (FILE_SHARE_READ | FILE_SHARE_WRITE)
[引用ここまで]
ただし下側の行に誤記があります。
−dwDesiredAccess=(FILE_SHARE_READ | FILE_SHARE_WRITE)ではなくて、−dwShareMode=
(FILE_SHARE_READ | FILE_SHARE_WRITE)です。
そういうことなのですか。
MSDNのCreateFileの説明(http://msdn.microsoft.com/ja-jp/library/cc429198.aspx)をもう一度参照してみました。
dwDesiredAccessに0を設定すると、「デバイスにアクセスすることなく、デバイス属性の問い合わせを行えます」と書いてあります。
HIDテストプログラムのCreateFileのところを直して試してみました。
dwShareMode(第3パラメータ)は、もとからFILE_SHARE_READ|FILE_SHARE_WRITEですから、dwDesiredAccess(第2パラメータ)のみ0に変更しました。
HANDLE handle = CreateFile( dev_det->DevicePath, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); |
unsigned long size; SetupDiGetDeviceInterfaceDetail( devinf, &spid, NULL, 0, &size, 0 ); PSP_INTERFACE_DEVICE_DETAIL_DATA dev_det = PSP_INTERFACE_DEVICE_DETAIL_DATA( new char[size] ); dev_det->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); // SetupDiGetDeviceInterfaceDetail( devinf, &spid, dev_det, size, &size, 0 ); cout << dev_det->DevicePath << endl; |
unsigned long size; SetupDiGetDeviceInterfaceDetail( devinf, &spid,NULL, 0, &size, 0 ); PSP_INTERFACE_DEVICE_DETAIL_DATA dev_det =new SP_INTERFACE_DEVICE_DETAIL_DATA[size]; dev_det->cbSize=sizeof(*dev_det); // SetupDiGetDeviceInterfaceDetail( devinf, &spid, dev_det, size, &size,0 ); cout << dev_det->DevicePath << endl; |