を使用した USB プロジェクトで問題が発生していますLIB-USB
。USB デバイスは PIC18F4550 に基づいており、単一の制御エンドポイントを備えています。PC フロントエンドは MSVC で書かれており、Lib-Usb 1.12 を使用しています。
PC 側では、プログラムはまず構成を設定し、インターフェイスを要求し、制御メッセージ (ベンダー固有) を送信 (および受信) します。すべて正常に完了します。ランダムなバイト数 (100 から 2000 の間) が転送された後、usb_control_msg 呼び出しからエラー rc=-5が返されて転送が停止します。
PC 側では、呼び出しは次のようになります。
ret = usb_set_configuration(udev, 1);
ret = usb_claim_interface(udev, 0);
ret = usb_control_msg(udev, USB_TYPE_VENDOR|USB_RECIP_DEVICE, CMD_RESET, 0, 0, buffer, 0, 100);
ret = usb_control_msg(udev, 0xC0, GET_FIFO_DATA, 0, 0, buffer, 8, 100);
実際に USB デバイスからデータを取得する最後の呼び出しは、何度も連続して実行されますが、この方法でランダムな数のバイト (合計で 100 から 2000) が転送された後、常に終了します。パイプを EP1 に変更すると、同じエラーが最終的に表示されます。
USB デバイス (PIC) 側では、記述子は非常に単純で、EP0 パイプのみを持ち、次のようになります。
Device
db 0x12, DEVICE ; bLength, bDescriptorType
db 0x10, 0x01 ; bcdUSB (low byte), bcdUSB (high byte)
db 0x00, 0x00 ; bDeviceClass, bDeviceSubClass
db 0x00, MAX_PACKET_SIZE ; bDeviceProtocol, bMaxPacketSize
db 0xD8, 0x04 ; idVendor (low byte), idVendor (high byte)
db 0x01, 0x00 ; idProduct (low byte), idProduct (high byte)
db 0x00, 0x00 ; bcdDevice (low byte), bcdDevice (high byte)
db 0x01, 0x02 ; iManufacturer, iProduct
db 0x00, NUM_CONFIGURATIONS ; iSerialNumber (none), bNumConfigurations
Configuration1
db 0x09, CONFIGURATION ; bLength, bDescriptorType
db 0x12, 0x00 ; wTotalLength (low byte), wTotalLength (high byte)
db NUM_INTERFACES, 0x01 ; bNumInterfaces, bConfigurationValue
db 0x00, 0xA0 ; iConfiguration (none), bmAttributes
db 0x32, 0x09 ; bMaxPower (100 mA), bLength (Interface1 descriptor starts here)
db INTERFACE, 0x00 ; bDescriptorType, bInterfaceNumber
db 0x00, 0x00 ; bAlternateSetting, bNumEndpoints (excluding EP0)
db 0xFF, 0x00 ; bInterfaceClass (vendor specific class code), bInterfaceSubClass
db 0xFF, 0x00 ; bInterfaceProtocol (vendor specific protocol used), iInterface (none)
実際のフレームワークは、Bradley Minch のアセンブリ言語のものです。
誰かがこの種の問題に遭遇したことがある場合は、別のパイプ (EP1、同じ結果) を使用して解決するためにあらゆることを試みたので、PIC の UOWN ビットを確認する前に、それについて聞いてみたいと思います。パイプへの書き込み、PC ホストとのハンドシェーク (データが書き込まれる前に PC が最初にベンダー固有のコマンドを送信する必要がある) が、役に立たない。