« USB入門 | トップページ | USB入門 »

2007年5月 8日 (火)

USB入門

CRC16

AVR Tiny2313でUSBデバイスは出来ている。そこで、こいつを使う
ための Windows用デバイスドライバを書かないといけないのだが、
何分素人なんで、デバイスドライバプログラミングなんてやった事が
ない。

解説書として「WindowsXPデバイスドライバプログラミング[入門と
実践]浜田憲一郎著」を用意した。私の様な素人さんにも解りやす
いらしい。

毎度の事ながら、解説書を読む。
毎度の事ながら、

うぅ~っ、わかんね。

なので、
毎度の事ながら、解説書を何回も読む。
という「毎度の事」を繰り返し、何とか

うっすら分かって来ましたよーっ!

で、うっすらUSBデバイスドライバを書いて見る。何とか認識されて、
Tiny2313のソフトで書かれたエンドポイントに対し送信。

うっすら受信出来ましたよーっ!

とりあえずUSBの通信は成功したが、さすがにTiny2313のメモリ
容量/スペックではUSBを実装するだけで、リソースをの殆どを
使い切っていてるし、所詮ロースピードデバイス。機能もうっすら。

これで何が作れるか、うっすら考えてみよう。

話は変わるが、USBのCRC計算法をググったあげく、当ブログに辿り
着いてしまった、というお気の毒な方がいらっしゃっる様なので、
私の付け焼刃の知識を恥ずかしながら披露する。

"HERO'S Download"から"AVRusb.ZIP"をダウンロード出来る。
この中にUSBの詳しいドキュメントがある。
USBのCRC16を計算するには「ハードウェアCRC16計算回路」
("USBspcs.pdf"に載っている)をエミュレートする。

Cで書くとこんな感じ

WORD UsbCrc16( int count, unsigned char *data )
{
    int      i, j;
    WORD crc = 0xffff;

    for( i = 0; i < count; i++ )
    {
        for( j = 0; j < 8; j++ )
        {
            if( crc & 0x0001 )
                data[ i ] ^= 0x01;

            crc >>= 1;

            if( data[ i ] & 0x01 )
                crc ^=0xA001;

            data[ i ] >>= 1;
        }
    }
    crc ^=0xffff;
    return crc;
}

引数dataがデータの配列、countがデータ数で、戻り値が求めたCRC。

|

« USB入門 | トップページ | USB入門 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/180469/15002483

この記事へのトラックバック一覧です: USB入門:

« USB入門 | トップページ | USB入門 »