マイコン工作実験日記

Microcontroller を用いての工作、実験記録

USB_LDDを使ってみる -- その2

2015-07-18 09:57:42 | Weblog
前回の記事の続きです。

USB_LDDのヘルプに基づいて、Device Descriptorの先頭部分を読み出すことはできたので、エニュメレーション手順を続けてみます。次の段階としては、デバイスに対してのアドレス割付が必要となります。具体的には次の2つの処理が必要です。
  1. デバイス側に対してSet Addressリクエストを送信する。
  2. 自分側のアドレスを設定する。

1番の処理の方は、送信するSETUPデータを用意して、それをHostSendSetupメソッドを使って送信してやればOKです。このリクエストではSETUPの8バイトに続けて送信あるいは受信するデータはないので、TDの部分のBufferやBufferSizeを指定する必要はありません。
const LDD_USB_TSDP SetAddress = {
    LDD_USB_DIR_OUT | LDD_USB_REQ_TYPE_STANDARD,        /* bmRequestType */
    LDD_USB_REQ_SET_ADDRESS,    /* bmRequest */
    toLittleEndian(0x0001),     /* wValue */
    toLittleEndian(0x0000),     /* wIndex */
    toLittleEndian(0x0000)      /* wLength */
};

...
...
    TD = InitTtDescr;       /* Set all items of TD to zero */
    TD.SDPPrt = (void *)&SetAddress;
    Error = USB1_HostSendSetup(MyUSBPtr, PipeHandle, &TD, &TrHandle);  
2番目の自分側アドレスの指定に関しては、これに対応する明示的なAPIはありません。Processor Expertが生成したコードを確認したところ、HostOpenPipeが返すPipeHandleデータの中に含まれるDevAddressで指定していることがわかりました。同様にパケットサイズもPipeHandleにてDevice Descriptorから取得した値(devMaxPacketSize)に変更しておきます。

PipeHandle->DevAddress = 1;
PipeHandle->MaxPacketSize = devMaxPacketSize;

このように設定しておき、以後のHostSendSetupにてはPipeHandleを引数として渡せば、割り当てたアドレス(1)との間で送受信が行われます。