携帯とのデータのやりとりの為に、AmazonでUSBのIrDAのモジュール(SD-IRU1S) を1780円で購入してみた。
モジュールの開発元のページ (既に製造中止の模様。。。)Full Speed device @ 3 (0x1D140000): .... Vendor-specific device from unknown vendor Device Descriptor Descriptor Version Number: 0x0110 Device Class: 255 (Vendor-specific) Device Subclass: 1 (Vendor-specific) Device Protocol: 0 Device MaxPacketSize: 8 Device VendorID/ProductID: 0x1685/0x0200 (unknown vendor) Device Version Number: 0x0008 Number of Configurations: 1 Manufacturer String: 0 (none) Product String: 0 (none) Serial Number String: 0 (none) Configuration Descriptor Length (and contents): 39 Raw Descriptor (hex) 0000: 09 02 27 00 01 01 00 80 DC 09 04 00 00 03 00 00 Raw Descriptor (hex) 0010: 00 00 07 05 81 03 0A 00 01 07 05 02 02 40 00 00 Raw Descriptor (hex) 0020: 07 05 83 02 40 00 00 Number of Interfaces: 1 Configuration Value: 1 Attributes: 0x80 (bus-powered) MaxPower: 440 ma Interface #0 - Unknown Alternate Setting 0 Number of Endpoints 3 Interface Class: 0 (Unknown) Interface Subclass; 0 Interface Protocol: 0 Endpoint 0x81 - Interrupt Input Address: 0x81 (IN) Attributes: 0x03 (Interrupt no synchronization data endpoint) Max Packet Size: 10 Polling Interval: 1 ms Endpoint 0x02 - Bulk Output Address: 0x02 (OUT) Attributes: 0x02 (Bulk no synchronization data endpoint) Max Packet Size: 64 Polling Interval: 0 ms Endpoint 0x83 - Bulk Input Address: 0x83 (IN) Attributes: 0x02 (Bulk no synchronization data endpoint) Max Packet Size: 64 Polling Interval: 0 ms
Endpointの構成がF5U103と同じなので、ほとんどコードをいじらずにいけそう。
USBRequest()の中身をコメントアウトして、idProduct,idVendorを変更して ビルドしてみた。
http://blaulogic.comというなくなったサイトにあったPico-IrDAという オープンソースをインターネットアーカイブからダウンロードしてちょっとい じったところ、BAUMからアドレスデータが受信できたので、ちゃんと動いてい るっぽい。今のところ送信は出来ていないがIrLAPの問題のようだ。
Pico-IrDAのいじったところはselect回り。
OpenOBEXというオープンソースもあるのだがこれはIrLAP層などがドライバー に含まれている事を前提にしたコードで、これ自体にIrLAPの実装がないので そのままでは使えないので断念した。Pico-IrDAの存在はpspirdaというアプリ から知った。
Pico-IrDAからBAUMへの転送が出来るようになった。問題はIrOBEXのフレーム をPico-IrDAから送った後にLAP,LMP,TTPだけの9バイトのフレームがBAUMから 返ってきてエラーになっていた。とりあえず再送すると2回目の送信ではIrOBEX のフレームが返ってくるようなので、ループを入れてみた。下がOpen時に再送 しているパターン。
Send : c0 03 76 02 01 01 80 00 07 10 00 00 78 2e 52 c1 Receive : c0 02 96 01 02 01 47 0f c1 Send : c0 03 98 02 01 01 80 00 07 10 00 00 78 67 a6 c1 Receive : c0 02 b8 01 02 00 a0 00 07 10 00 07 fd 47 0f c1
送受信できるようになったのだが今度は時々ドライバーが固まる。アプリケー ション側のデバッグライトを外すと固まる頻度があがる。アプリケーションも 一緒に固まるのだが、gdbでみるとreadで止まっている。
書き込みの処理は以下のような流れ。StartTransmissionでエンドポイントの パイプにWriteしています。
enqueueData -> SetUpTransmit -> StartTransmission
ソースをubsa-osxの svn にアップしてみた。レジスタの読み込みを試したのだが DeviceRequestがe000404fでエラーになるので、とりあえずあきらめた。 全くコントロールが効かないが初期状態の9600で通信できている。また気が向 いたらデバッグしてみたい。(2010/02/12)
DeviceRequestのパラメータはMCS7780の新しいデータシート(Rev. 1.2)にはな いのだが古い(Rev. 1.0)には記載があったのでそれを使った。IOUSBと相性が悪 いのか、パラメータ自体が間違えているのかのどちらかだと思われる。
MCS7780にはインタラプトのエンドポイントが存在するが使われていないような 感じだ。おそらく他のUART系USBのチップと同じコアを使った為に残っている のはないかと想像される。
元のBelkinF5U103Driverのコードから制御線関係のコードを外してクリーンア ップしてある。
大きなデータを送るとまだ落ちる。。。
Pico-IrDAを使ってMac OS Xのアドレスブックのプラグインを作ってみた。 電話番号をクリックしてデータを送れるようになっている。ソースはubsa-osxの svn に入れてある。
BEGIN:VCARD VERSION:2.1 N;CHARSET=SHIFT_JIS:テスト;;;; SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:テスト;;;; TEL;PREF;HOME:0312345678 X-070;BUNKEI:0 EMAIL;PREF;HOME:abc@pdx.ne.jp X-CLASS:PUBLIC BDAY:20000101 X-HOBBY;CHARSET=SHIFT_JIS:読書 X-CONSTELLATION:CAPRICORN NOTE;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=82=D9=82=B0 REV:20100207T013200Z X-REDUCTION:5 X-GNO:0 END:VCARD調子に乗ってもう一つドングルを買ってみたのだが、こちらは10.5.8のIOUSB (IOUSBFamily 3.5.2)とは相性が悪くて認識されない。 FreeBSDでは以下のようにでるのだが。。。
port 1 addr 2: full speed, power 440 mA, config 1, IrDA/USB Bridge(0x4200), Sig matel Inc(0x066f), rev 0.08エラーメッセージ
The IOUSBFamily is having trouble enumerating a USB device that has been plugged in. It will keep retrying. The IOUSBFamily was not able to enumerate a device.