もともと簡単なものなので、移植するのは次の2点だけです。
1)シリアルポートの制御
open/close/read/write を使うことにして、ファイルディスクリプタを使ってシリアルポートの設定をする 関数を別に用意することにします。ファイルディスクリプタからハンドルへの変換は、_get_osfhandle が使えました。
シリアルポート設定自体は、avrdude を参考に作りました。あと、open のオプションに O_BINARY が必要でした。
2)usleep の作成
WIN32API には、ms 単位の Sleep があるので、単位を変換して usleep を作ることにしました。
あと、性能を測るために、double dtime() という関数を作りました。Linux だと gettimeofday を使えばよいわけですが、WIN32API だと TimeGetTime() 。この関数を使うには、リンカオプションで -lwinmm が必要でした。
MinGW でも getopt が使えるようなので、ついでにオプションの処理を整理。
テスト1
AVR-CDC 性能測定に使った、テストプログラムを使って長時間エラーなしに使えるかやってみました。百万回ほど通信しましたが OK でした。


変な形ですが、何回やってもこうなります。ドライバの作りと カーネルのイベントの処理の特性だと思っていますが、ひょっとしたら USBのコントローラとかハードウェアの違いでこうなるのかも知れません。
もっと I/O サイズを大きくしたらどうなるか興味が出てきました。別途テストしてみたいと思います。
テスト2
RC発振器のキャリブレーションで使ったプログラムが動くか確認。このプログラムは、I2Cで通信しています。I2Cの通信では、BUSY のときは、−2 を返して通信できない仕様にしているので、タイミングも関係あります。もとのテストプログラムがいいかげんだったので、結構ハマリました。−2が返ってきたときはリトライするコードを入れることで(って仕様どおりにしただけなんですが)一応ちゃんと動くようになりました。
最新版は、
usb910-0.4.tar.gz、usb910-0.4.zipです。MinGW/MSYS でビルドする場合、tar.gz の方を使ってください。
注意点 ... テストプログラムは自由につかっても良いですが、-Wall すると山のように Warning が出ます。その程度のものですので、あまり信用しないように。
まだ問題はあるかも知れませんが、とりあえずは Windows でも USB910 を使えるようにしました。よかったら USB910 で遊んでみてください。