EHCI で Get Descriptor

とりあえず達成。
Zynq で USB Host で EHCI で GetDescriptor できた。
f:id:ryos36:20160303011845p:plain
基本的には u-boot に書いてあるそのままを実行した。

ソースはというと、、、、

    uint32_t *qTD_Setup_Data = &qTD_Setup[1024];
    qTD_Setup[0] = (uint32_t)qTD_Setup_Data;
    qTD_Setup[1] = 1;
    qTD_Setup[2] = (0 << 31) | (8 << 16) | (3 << 10) | (2 << 8) | (1 << 7) ;
    qTD_Setup[3] = (uint32_t)&dbp[0];
    qTD_Setup[4] = qTD_Setup[5] = qTD_Setup[6] = qTD_Setup[7] = 0;

    dbp[0] = 0x80;
    dbp[1] = 0x06; // GET DESCRIPTOR
    dbp[2] = 0;
    dbp[3] = 1;    // DEVICE
    dbp[4] = 0;
    dbp[5] = 0;
    dbp[6] = 64;
    dbp[7] = 0;

こんなんだから、汎用性はない!!でも動く。
内容はこんな感じ。

xsdb% mrd 0x11d000 8
  11D000:   01100112
  11D004:   40000000
  11D008:   094004BB
  11D00C:   02010001
  11D010:   00000103
  11D014:   00000000
  11D018:   00000000

4 バイトごとに反転しているからわかりづらい、、、
0x12 0x01 0x10 0x01
とちゃんと USB の規約にのっとたデータが来てます(当たり前)。ここまでかけちゃうとオレオレ scheme か FORTH で書いてしまいたくなるなぁ。

EHCI を初めて試したが、それにしてもバッファを荒らす。メモリを使っていろんなところに書き込みをします。これ性能出るの?今後はアイソクロナスにもチャレンジしていきたい。MIDI データとか音楽データとかビデオ画像とかね。