FrontPage
2008/10/14 からのアクセス回数
インターネット・ガジェット設計にlibusbとUSBプロトコルスタックを使って自作のUSBデバイスにアクセスする 例があったので、Mac OSXで動作を確認しました。
libusbを使った自作デバイスには、以下のライブラリが必要です。
テストに使用するデバイスは、5章の「USBプロトコール・スタックを使う」のTiny45を使った例題に従いました。
5章の「USBプロトコール・スタックを使う」の図5.9の回路図
には、誤植がありTA48M033Fのピン番号が1と2が入れ替わっています。
最終のブレッドボードの回路は、USBとTiny45(書込用)の2個を連結しました。
回路を組み立てるときには、データシートでピン番号の配置を確認して、接続しましょう。
テストプログラムは、ホストのshow.cとターゲットデバイスのfirmware/main.cで主な処理をしています。
ホストプログラムは、usbデバイスをオープンした後、usb_control_msg関数を使ってデバイスにデータを 送信します。
show.cでは、usb_control_msgの引数を使ってデバイスにデータを渡しているのですが、その仕組みが分かりにくいので、少し補足をします。
http://avrusb.wikidot.com/driver-apiによると、
typedef struct usbRequest{
}usbRequest_t; }} の8バイトの要求が送られます。 show.cの例題では、この要求メッセージをデータとしてターゲットに渡しているのです。
例題では、送られたデータを1つシフトした7バイトの情報を返します。
show.cのUSBデバイスのオープン
static int usbOpenDevice(usb_dev_handle **device, int idvendor, int idproduct) {
} }}
メイン関数は、
int main(int argc, char **argv) {
ret=usbOpenDevice(&d, IDVendor,IDProduct); if(ret!=0){printf("usbOpenDevice failed\n"); return 0;}
printf("ret=%d \n",ret); for(p=0;p<ret;p++){printf("buffer[%d]=%d \n",p, buffer[p]);}
} }}
ターゲットusbFunctionSetupは、
uchar usbFunctionSetup(uchar data[8]) { static uchar replybuf[8]; usbMsgPtr = replybuf;
return 7; } }} となります。
完全なソースは、http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-50186-9からダウンロードできます。
ダウンロードしたファイルのUSBtesttiny45ディレクトリに移動します。
ホストのコンパイルは、
$ cc -o show show.c -lusb }} でshowが作成されます。
今回は、AVR ISP mkIIを使用するので、 firmwareディレクトリに移動して、Makefileを以下のように修正しました。
avrdude:
lfuse:
}}
後は、makeコマンドでターゲットデバイスへの書き込みまで実行します。
$ make }}
最後にshowを実行します。
$ ./show ret=7 buffer[0]=9 buffer[1]=3 buffer[2]=4 buffer[3]=5 buffer[4]=6 buffer[5]=7 buffer[6]=8 }}
と出力されたら、完成です。
この記事は、
皆様のご意見、ご希望をお待ちしております。