« 2006年11月 | トップページ | 2007年4月 »

2006年12月21日 (木)

USB入門

USBデバイスを作る5

Usb03

 

 

 

エニュメレーション成功。何とか、辛うじて。

AVRでUSBデバイスを作ろうとしてから2月、やっとPCから
USBデバイスとして認識させる事が出来た。
USBの場合電気的なインターフェイス/プロトコルを実装し
ても、その上層のUSBプロトコルを実装しない限りPCとの
通信は出来ない。

いやぁ、悩ませて貰いました。

ハマッた所

  標準デバイスリクエストのSET_ADDRESを受け取っ
  ても、すぐにアドレスを変更してはいけない。
            ↓
  その後に続くシェイクハンド用入力指示PIDを受信
  出来なくなる。

  CRCの計算はハードウェア計算回路をエミュレート
  する。
            ↓
  良く見ると一般的なCRC計算とちょっと違う。

  GET_DESCRIPTORの前に大量の入力指示PIDを受信
  しても驚かない。
            ↓
  それは、同じロースピードデバイスであるマウスや
  キーボードの為のもの。ちゃんと自アドレスに向け
  てのパケットか確認する。

  バッファが空いているからといって、むやみにデータ
  パケットを受信し、ACKを勝手に返してはいけない。
            ↓
  データパケットはシェイクハンドにも用いられるので、
  得られるはずのデータパケットを受け損なう可能性大。

ほかにも色々あったが、どれもきちんとUSBプロトコルを
理解していないのが一番の原因だった。

時間は掛かったがなんとか動いた。よかった。
やって見れば出来るもんだと、一人で勝手に感動。

しかしAVRって凄い。20MHzのセラロックと抵抗3本だけで、
USBデバイスが出来るかもしれない。しかも、リアルタイムに
データをNRZI変調して送信。受信側もNRZIから復号しながら
データを取り込む(挿入ビットの削除までは出来なかった)
事が出来だけのパワーを持っている。PICでは無理だ。

さて、USBデバイスとして認識させることは出来たが、これだ
けではPCと任意の通信はできない。PC上のドライバが必要
だ。なので、次はデバイスドライバーを書いてみようと思う。
が、デバイスドライバーを書いた経験は無い。いつもの事だ
が出来るかどうか分からないが、取り敢えずやってみよう。

| | コメント (2) | トラックバック (0)

« 2006年11月 | トップページ | 2007年4月 »