前回の記事の続きです。
USB_LDDのヘルプに基づいて、Device Descriptorの先頭部分を読み出すことはできたので、エニュメレーション手順を続けてみます。次の段階としては、デバイスに対してのアドレス割付が必要となります。具体的には次の2つの処理が必要です。
1番の処理の方は、送信するSETUPデータを用意して、それをHostSendSetupメソッドを使って送信してやればOKです。このリクエストではSETUPの8バイトに続けて送信あるいは受信するデータはないので、TDの部分のBufferやBufferSizeを指定する必要はありません。
このように設定しておき、以後のHostSendSetupにてはPipeHandleを引数として渡せば、割り当てたアドレス(1)との間で送受信が行われます。
USB_LDDのヘルプに基づいて、Device Descriptorの先頭部分を読み出すことはできたので、エニュメレーション手順を続けてみます。次の段階としては、デバイスに対してのアドレス割付が必要となります。具体的には次の2つの処理が必要です。
- デバイス側に対してSet Addressリクエストを送信する。
- 自分側のアドレスを設定する。
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)との間で送受信が行われます。