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]が存在するデバイス用のドライバを開発する場合は、この対応が必須となります。

