PICマイコン USB HOST(USB Framework)のベンダークラス対応
作成者:mou-mou
マイクロチップ・テクノロジー社より提供されているApplication librariesに含まれるUSB Framework(v2013-06-15)を使用して、USBホストを構築する場合に、USBの標準クラスを使用する場合は問題ありませんが、ベンダークラスを使用した場合には、一部不適合箇所があります。
【usb_host.c】
BYTE USBHostIssueDeviceRequest( BYTE deviceAddress, BYTE bmRequestType, BYTE bRequest, WORD wValue, WORD wIndex, WORD wLength, BYTE *data, BYTE dataDirection, BYTE clientDriverID ) { ・ ・ ・ // If the user is doing a SET INTERFACE, we must reset DATA0 for all endpoints. if (bRequest == USB_REQUEST_SET_INTERFACE) // !問題箇所 { USB_ENDPOINT_INFO *pEndpoint; USB_INTERFACE_INFO *pInterface; USB_INTERFACE_SETTING_INFO *pSetting;
条件文が(bRequest == SET_INTERFACE)となっていますが、SET_INTERFACEというのは標準リクエストでの値は[11]である為、ベンダーリクエストで値が[11]の要求があった場合に、上記の処理が意図せず実行されてしまいます。
以下のように修正することで、bmRequestTypeを「ホストからデバイス」「標準リクエスト」「リクエスト対象がデバイス」に限定します。
【usb_host.c】
BYTE USBHostIssueDeviceRequest( BYTE deviceAddress, BYTE bmRequestType, BYTE bRequest, WORD wValue, WORD wIndex, WORD wLength, BYTE *data, BYTE dataDirection, BYTE clientDriverID ) { ・ ・ ・ // If the user is doing a SET INTERFACE, we must reset DATA0 for all endpoints. // if (bRequest == USB_REQUEST_SET_INTERFACE) // !修正箇所 if ((bRequest == USB_REQUEST_SET_INTERFACE) && (bmRequestType == USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE)) { USB_ENDPOINT_INFO *pEndpoint; USB_INTERFACE_INFO *pInterface; USB_INTERFACE_SETTING_INFO *pSetting;
ベンダーリクエストに[11]が存在するデバイス用のドライバを開発する場合は、この対応が必須となります。