技術コラム

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

トラックバックURL

URL:https://rightxlight.co.jp/technical/pic-usb-framework-host-correct/trackback/

よく読まれている記事はこちら

ソフトウェアからハードウェアまで、
まずはお気軽にご相談下さい。

お電話はこちら

お電話はこちら 06-6309-7782

受付時間:9:00~18:00(土日祝は除く)

メールフォームからはこちら

お問い合わせお問い合わせ

Copyright (C) Since 2011 RIGHTxLIGHT Co., Ltd. All Rights Reserved.

PAGE TOP