PICマイコン USB HOST(USB Framework)のベンダークラス対応

マイクロチップ・テクノロジー社より提供されている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]が存在するデバイス用のドライバを開発する場合は、この対応が必須となります。

タグ


2013年10月17日 | コメントは受け付けていません。|

カテゴリー:技術情報

トラックバック&コメント

コメントは受け付けていません。

このページの先頭へ

イメージ画像