BCB6でWinUSB
uusbdもlibusbもbcb6で動かしたので
その延長でwinusbも動かそうとしたのですが
やっぱりbcb6はかなり古いものになってしまったので
対応できてない部分があるようでした。
(私が知らない設定もあるのかもしれません。)
かなり無理やりで信頼性がないですが
とりあえず下のようにすると動きました。
interface2010年2月号「第5章 WinUSBを使ったUSBターゲット機器の制御プログラミング」も参考。
---
・bcb用ライブラリを作り直す
implib winusb.lib winusb.dll
で。これはwinusbに限らずuusbd/LibUsbでも必要。
・bcb6そのままではsetupapi関連がうまく動作しないので、
update4を適用する。
・_tcscpy_s()はbcb6にはないので_tcsnccpy()にとりあえず置きかえ。
引数に注意。
・BCB6では宣言が無いためにエラーになるものがある。とりあえず
#define __in
#define __out
#define __out_bcount_part_opt(a,b)
#define __inout
#define __out_bcount(a)
#define __in_bcount(a)
#define __out_opt
#define __in_opt
として、消す。
・WinUsb_QueryPipe()で受け取ったEndpointの情報pipeInfoの
メンバーの値がおかしい。
なぜか
PipeId→pipeInfo.Interval,0→pipeInfo.PipeId,0→pipeInfo.MaximumPacketSize
のようになる。
→
winusb.dllを動的にロードするようにしてみても全く同じ。
とりあえずpipeInfo.IntervalをPipeIdとして扱うように修正すれば
とりあえずなんとかなるけど他のパラメータは使えないので注意。
私はConfiguration Descriptorを取り直してpipeInfoをつくる
関数を作って使うようにしてみた。
---
ちなみに、C++BUILDER 2010をインストールしてみて
ためしたら、上記のうち、ライブラリの作り直し以外のことは
不要で、普通にコンパイルでき、普通に動作しました。
| 固定リンク
「usb」カテゴリの記事
- stm32ループバック(HID)&BCB6アプリ(2011.10.02)
- BCB6でWinUSB(2010.07.13)
- stm32でさらにWinUSBも試す(2010.06.20)
- stm32の動作(2010.06.16)
- stm32でuusbdをためしてみたら(2010.06.12)
この記事へのコメントは終了しました。
コメント
はじめまして。
私もここで詰まったので、非常に参考になりました。
Pipe情報のデータがずれるのは、
WINUSB_PIPE_INFORMATION構造体のPipeTypeメンバが
本来4byteなのに、なぜか1byteとして解釈されることに原因がありますね。
私は以下のように構造体を定義して、
bcb_WINUSB_PIPE_INFORMATION{
unsigned long PipeType;
unsigned char PipeId;
unsigned short MaximumPacketSize;
unsigned char Interval;
};
WinUsb_QueryPipe()にキャストしてアドレスを渡すようにしました。
投稿: mickey | 2012年7月21日 (土) 11時03分
> Pipe情報のデータがずれるのは、
> WINUSB_PIPE_INFORMATION構造体のPipeTypeメンバが
> 本来4byteなのに、なぜか1byteとして解釈されることに原因がありますね。
> WinUsb_QueryPipe()にキャストしてアドレスを渡すようにしました。
そちらのほうがスマートですね。
ご連絡ありがとうございました。
投稿: tag | 2012年7月22日 (日) 14時25分
はじめまして。
私もC++Builder5で同じ事をやっていて、この問題に気付きました。
いろいろやってみた結果、
プロジェクト→オプション→[コンパイラ]タブで
・enum型をint型として扱う
のチェックボックスをONにしたことで解決しました。
もしC++Builder6で同じようなオプションがあれば試してみてください。
投稿: Ta-Mori | 2015年3月12日 (木) 18時41分
ありがとうございます。
PC環境がかわってしまってからやってないのですが
そのうち試してみたいと思います。
投稿: tag | 2015年5月 1日 (金) 05時58分