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日 | コメントは受け付けていません。|

カテゴリー:技術情報

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

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

このページの先頭へ

イメージ画像