У меня проблема с проектом USB, использующим LIB-USB
. Устройство USB основано на PIC18F4550 и имеет единственную контрольную точку управления. Интерфейс ПК написан на MSVC и использует Lib-Usb 1.12.
На ПК программа запускается с настройки конфигурации, запроса интерфейса, затем отправки (и получения) управляющих сообщений (в зависимости от поставщика) - все успешно. После того, как было передано случайное число байтов (где-то между 100 и 2000), передача останавливается с error rc = -5 , возвращенной из вызова usb_control_msg.
На ПК-конце вызовы выглядят так:
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)
Фактическая структура - это структура Брэдли Минча на ассемблере.
Если кто-то сталкивался с подобным типом проблемы, прежде чем я хотел бы услышать об этом, поскольку я пытался решить практически все, включая использование другого канала (EP1, с теми же результатами), включив бит UOWN PIC перед записью в канал, рукопожатие с хостом ПК (когда ПК должен отправить специфичную для поставщика команду перед записью датсы), но безрезультатно.