前回に引き続きUSB-1608FSネタ。
あの後、取り込みを行おうと色々やってみても上手くいかなかったので、とりあえずより簡単そうな「LEDの点滅」でヒントを手に入れようと。
参考にしたのはSnoopyProの出力とUSB-1608FSのLinux向けサードパーティ製ドライバのソースコード(C言語)。
それと、数々の先人達のページ等々(最後に列挙)。
SnoopyProは、PCとUSB機器の間で行われる通信を「嗅ぎ回る(snoop)」ソフトウェア。
上の画像のような結果が得られます。
因みにアイコンはスヌーピー。
ヘルプも読まず、しばらく使い方が分からずにいたのは自分です。
これは残念ながらLinuxでは使えなかったのでWindowsでsnoopしました。
ドライバのほうは、これを入れてしまえばPythonからC言語のライブラリを扱えるctypeで使うことが出来る、と踏んでいたのに上手いことインストール出来ず断念。
中でやっていることをPyUSB的に書き直す、という具合のことをやっております。
さて、USB-1608FSに付属のInstaCalでインジケータLEDを点滅させたところまでのsnoop結果が上の画像になります。
初期化云々で436パケット、その後のLED点滅で2パケット増加しましたので、その最後の2パケットに「LED点滅命令」が含まれているはず!
「TransferBuffer」のある227 out downが怪しいと考え、各種引数に対応する(と思う)値を代入して
USB1608FS.ctrl_transfer(0x22, 0x09, 0x40, 0x02, [0x40, 0x00])
しましたが
USBError: Input/output error
ここでまたもやしばらく悩むことに。
しかしながら何故か閃き
USB1608FS.ctrl_transfer(0x21, 0x09, 0x40, 0x02, [0x40, 0x00])
という具合に第1引数(bmRequestType)を227 out downに続く227 out upで使われている値に変更したところ、通った!点滅した!
よし、この勢いで取り込み!
とはいきません…
因みに
USB1608FS.ctrl_transfer(0x21, 0x09, 0x0, 0x0, [0x40, 0x00])や
USB1608FS.ctrl_transfer(0x21, 0x09, 0x40, 0x02, [0x40])でも点滅したので実際のところ重要なのは「0x21」「0x09」「[0x40]」っぽいです。
最後の引数はリストにしないと「繰り返し不可」みたいなエラーが返ってきます。
参考ページ
libusbについて - Linux工作室
技術資料 - C言語 演算子
libusb: Synchronous device I/O
libusb-1.0 – libUSBとは 技術解説 電子デバイス・半導体 : 富士通usb
Hacking the Kinect - How to hack USB device drivers
No comments:
Post a Comment