Перейти к содержанию
    

Проблема с hid-устройством

Заранее большая благодарность всем кто откликнется и даст толковый совет.

Ситуация такая: есть usb-устройство на основе isp1181a, а именно hid-устройство для передачи блока данных размером 1 байт. Устройство проходит энумерацию на шине. Реализован весь протокол пересылки дескрипторов. Проблема в том, что после запроса дескриптора репорта 8106002200005700 нет таких очень важных и необходимых запросов на input-report - т.е. нет возможности передавать данные.

Не понятно, почему идёт запрос 0х57 байт репорта, когда там всего 0х17 байт.Я работаю под WIN2000, под XP такая-же проблема.

 

Вот весь процесс энумерации на шине, а после неё все мои дескрипторы. Может кто сталкивался с такой-же проблемой - подскажите пожалуйста что нужно делать в этом случае.

 

000001: Abort Pipe (DOWN), 27.06.2006 18:04:55.7500000 +2.8125000

Pipe Handle: 0x816b94c0

 

000003: PnP Event: Device Disconnected (UP), 27.06.2006 18:04:55.7500000 +0.0

The USB device has just been removed from the system, all drivers unloaded.

 

000004: PnP Event: Query ID (UP), 27.06.2006 18:04:55.7500000 +0.0

Hardware IDs: USB\Vid_1131&Pid_8141&Rev_0000, USB\Vid_1131&Pid_8141

 

000005: PnP Event: Query ID (UP), 27.06.2006 18:04:55.7500000 +0.0

Compatible IDs: USB\Class_03&SubClass_00&Prot_00, USB\Class_03&SubClass_00, USB\Class_03

 

000006: Get Descriptor Request (DOWN), 27.06.2006 18:04:56.2968750 +0.5468750

Descriptor Type: Device

Descriptor Index: 0x0

Transfer Buffer Size: 0x12 bytes

 

000007: Control Transfer (UP), 27.06.2006 18:04:56.3593750 +0.0625000

Pipe Handle: 0x81782934

 

12 01 10 01 00 00 00 40 31 11 41 81 00 00 01 02 03 01 [email protected]......

 

Setup Packet

 

80 06 00 01 00 00 12 00 ?.......

 

Recipient: Device

Request Type: Standard

Direction: Device->Host

Request: 0x6 (GET_CONFIGURATION)

Value: 0x100

Index: 0x0

Length: 0x12

 

000008: Get Descriptor Request (DOWN), 27.06.2006 18:04:56.3593750 +0.0

Descriptor Type: Configuration

Descriptor Index: 0x0

Transfer Buffer Size: 0x9 bytes

 

 

000009: Control Transfer (UP), 27.06.2006 18:04:56.4375000 +0.0781250

Pipe Handle: 0x81782934

 

09 02 22 00 01 01 00 C0 00 .."....À.

 

Setup Packet

 

80 06 00 02 00 00 09 00 ?.......

 

Recipient: Device

Request Type: Standard

Direction: Device->Host

Request: 0x6 (GET_CONFIGURATION)

Value: 0x200

Index: 0x0

Length: 0x9

 

000010: Get Descriptor Request (DOWN), 27.06.2006 18:04:56.4375000 +0.0

Descriptor Type: Configuration

Descriptor Index: 0x0

Transfer Buffer Size: 0x22 bytes

 

 

000011: Control Transfer (UP), 27.06.2006 18:04:56.5000000 +0.0625000

Pipe Handle: 0x81782934

 

09 02 22 00 01 01 00 C0 00 09 04 00 00 01 03 00 00 00 09 21 00 01 00 01 22 17 00 07 05 81 03 08 00 00 .."....À...........!...."........

 

Setup Packet

 

80 06 00 02 00 00 22 00 ?.....".

 

Recipient: Device

Request Type: Standard

Direction: Device->Host

Request: 0x6 (GET_CONFIGURATION)

Value: 0x200

Index: 0x0

Length: 0x22

 

000012: Select Configuration (DOWN), 27.06.2006 18:04:56.5000000 +0.0

Configuration Index: 1

 

000013: Select Configuration (UP), 27.06.2006 18:04:56.5625000 +0.0625000

Configuration Index: 1

Configuration Handle: 0xe26e0fa8

 

000014: Class-Specific Request (DOWN), 27.06.2006 18:04:56.5625000 +0.0

Destination: Inrterface, Index 0

Reserved Bits: 34

Request: 0xa

Value: 0x0

Send 0x0 bytes to the device

 

 

000015: Control Transfer (UP), 27.06.2006 18:05:01.6562500 +5.0937500

Pipe Handle: 0x81782934

 

Setup Packet

 

21 0A 00 00 00 00 00 00 !.......

 

Recipient: Inrterface

Request Type: Class

Direction: Host->Device

Request: 0xa (Unknown)

Value: 0x0

Index: 0x0

Length: 0x0

 

 

000016: Get Descriptor Request (DOWN), 27.06.2006 18:05:01.6562500 +0.0

Descriptor Type: Unknown

Descriptor Index: 0x0

Transfer Buffer Size: 0x57 bytes

 

 

000017: Control Transfer (UP), 27.06.2006 18:05:01.7187500 +0.0625000

Pipe Handle: 0x81782934

 

06 00 FF 09 01 A1 01 19 01 29 01 15 00 26 FF 00 75 08 95 01 81 02 C0 ..ÿ..¡...)...&ÿ.u.•..À

 

Setup Packet

 

81 06 00 22 00 00 57 00 .."..W.

 

Recipient: Inrterface

Request Type: Standard

Direction: Device->Host

Request: 0x6 (GET_CONFIGURATION)

Value: 0x2200

Index: 0x0

Length: 0x57

 

000018: PnP Event: Query ID (UP), 27.06.2006 18:05:01.7187500 +0.0

Device ID: USB\Vid_1131&Pid_8141

 

 

000019: PnP Event: Query ID (UP), 27.06.2006 18:05:01.7187500 +0.0

Hardware IDs: USB\Vid_1131&Pid_8141&Rev_0000, USB\Vid_1131&Pid_814

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Мои дескрипторы

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;описание стандартных дескрипторов

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;стандартный дескриптор устройства

usb_device_descriptor:

.db 0x12 ;bLength длина дескриптора

.db 0x01 ;bDescriptorType тип дескриптора

.db 0x10 ;bcdUSB версия спецификации USB в формате BCD

.db 0x01 ;

.db 0x00 ;bDeviceClass код класса USB

.db 0x00 ;bDeviceSubClass код подкласса устройства USB

.db 0x00 ;bDeviceProtocol код протокола USB

.db 64 ;bMaxPacketSize мах размер нулевой конечной точки

.db 0x31 ;idVendor идентификатор изготовителя устройства

.db 0x11 ;

.db 0x41 ;idProduct идентификатор продукта

.db 0x81

.db 0x00 ;bcdDevice номер версии устройства в формате BCD

.db 0x00

.db 0x01 ;iManufacturer индекс дескриптора строки описывающей изготовителя

.db 0x02 ;iProduct индекс дескриптора строки описывающей продукт

.db 0x03 ;iSerialNumberиндекс дескриптора строки описывающей серийный номер устройства

.db 0x01 ;bNumConfigurations количество возможных конфигураций устройства

 

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;стандартный дескриптор конфигурации1

;сразу за ним следует описание дескриптора интерфеса1 и дескрипторы всех конечных точек, входящих в интерфейс1

;описание дескриптора интерфеса2 и дескрипторы всех конечных точек, входящих в интерфейс2

;далее следует опитсание дескриптора конфигурации2

usb_config_descriptor1:

begin_config:

.db 0x09 ; bLength длина дескриптора

.db 0x02 ;bDescriptorType тип дескриптора

.db low(end_config-begin_config) ;wTotalLenth полный размер описания конфигурации включая описание всех интерфейсов и точек

.db high(end_config-begin_config)

.db 0x01 ;bNumInterface кол-во интерфейсов в данной конфигурации

.db 0x01 ;bConfigurationValue номер конфигурации используемый по требованию SET_CONFIGURATION

.db 0x00 ;iConfiguration индекс строки описывающий данную конфигурацию

.db 0b11000000 ;bmAttribute

;битовая маска характеризующая конфигурацию

;D7 - зарезервирован=1

;D6 - признак наличия собственного источника питания

;D5 - признак разрешения сообщения хосту о выходе у-ва из режима сна

;D4-D0 - зарезервированы=0

.db 0x00 ;bMaxPower мах ток потребления от шины для устройств без собственного и-ка питания, кратность едениц 2 ма

end_usb_config_descriptor1:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;описание дескриптора интерфеса10

usb_interf_descriptor10:

.db 0x09 ;bLength длина дескриптора

.db 0x04 ;bDescriptorType тип дескриптора

.db 0x00 ;bInterfaceNumber номер данного интерфейса

.db 0x00 ;bAlternateSetting номер альтернативной установки для данного интерфейса

.db 0x01 ;bNumEndpoints число конечных точек для данного интерфейса без учёта нулевой конечной точки

.db 0x03 ;bInterfaceClass код класса интерфейса 0x03 код HID-устройства

.db 0x00 ;bInterfaceSubClass код класса интерфеса,

.db 0x00 ;bInterfaceProtocol код протокола

.db 0x00 ;iInterface индекс дескриптора строки описывающей интерфейс

;при использовании только конечной точки 0 дескриптор конечной точки не требуется

end_usb_interf_descriptor10:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;описание дескриптора HID-устройства

usb_hid_descriptor:

.db 0x09 ;bLength длина дескриптора

.db 0x21 ;bDescriptorType тип дескриптора

.db 0x00 ;bcdHID версия HID

.db 0x01

.db 0x00 ;bCountryCode числовой код страны для локализированых устройств

.db 0x01 ;bNumDescriptor число дескрипторов репортов

.db 0x22 ;bNumReportType номер дескриптора репорта используемый при вызове Set_Descriptor

.db low(end_report-begin_report) ;wReportLength размер дескриптора репорта

.db high(end_report-begin_report)

;.db 0x00 ;bReportType номер дополнительного дескриптора

;.db 0x00 ;wReportLenth размер дополнительного дескриптора

;.db 0x00

;при использовании только конечной точки 0 дескриптор конечной точки не требуется

end_usb_hid_descriptor:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;описание дескриптора конечной точки входящей в

usb_endpoint_descriptor100:

.db 0x07 ;bLength длина дескриптора

.db 0x05 ;bDescriptorType тип дескриптора

.db 0b10000001 ;bEndpointAddress бит7 0-OUT, 1-IN

;6-4 зарезервировано=0

;3-0 номер конечной точки

.db 0b00000011 ;bmAttributes

;7-6 зарезервировано=0

;5-4 тип использования конечной точки 00-для передачи данных, 01-для явной обратной связи

; 10-для неявной обратной связиб 11-зарезервировано

;3-2 тип синхронизации 00-нет синхронизации, 01-асинхронная, 10-адаптивная, 11-синхронная

;1-0 тип конечной точки 00-канал сообщений, 01-изохронный канал

; 10-канал передачи данных, 11-канал прерываний

.db 0x08 ;wMaxPacketSize мах размер пакета конечной точки

.db 0x00

.db 0x00 ;bInterval интервал опроса конечной точки в мс для кт прерываний

;1 для изохронной кт, для остальных типов кт не имеет значения

end_usb_endpoint_descriptor100:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

end_config:

;окончание описания конфигурации1

;end_usb_config_descriptor1:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;дескриптор рапорта hid-устройства

usb_report_descroptor:

begin_report:

.db 0x06 ;Usage_Page (Generic Desktop)

.db 0x00

.db 0xff

 

.db 0x09 ;Usage (Vendor Usage 1)

.db 0x01

 

.db 0xa1 ;Collection (Aplication)

.db 0x01

 

.db 0x19 ;Usage_Minimum (Vendor Usage 1)

.db 0x01

 

.db 0x29 ;Usage_Maximum (Vendor Usage 1)

.db 0x01

 

.db 0x15 ;Logical_Minimum (0)

.db 0x00

 

.db 0x26 ;Logical_Maximum (255)

.db 0xff

.db 0x00

 

.db 0x75 ;Report_Size (8)

.db 0x08

 

.db 0x95 ;Report_Count (1)

.db 0x01

 

.db 0x81 ;Input (Data, Var, Abs)

.db 0x02

 

.db 0xc0 ;End_Collection

end_report:

end_usb_report_descroptor:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думаю, что проблема в том, что в дескрипторе Вашей единственной InterruptEndPoint указан

0-й период опроса, что допустимо только для Bulk и Control EP!

07 05 81 03 08 00 00 <- Низ-зя!

 

У Вас же в исходнике ясно написано - в mS:

db 0x00 ;bInterval интервал опроса конечной точки в мс для кт прерываний

;1 для изохронной кт, для остальных типов кт не имеет значения

end_usb_endpoint_descriptor100:

 

"Для конечных точек прерывания, это поле может иметь значение от 1 до 255."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Спасибо AlexBoss за ответ. К сожалению это число никак не влияет на ситуацию - запросов всёравно нет. Я это устройство делал по примеру из Агурова. Даже если сделать всё так как написано в его книге - результата нет. Точнее есть но не совсем такой как у него. Так например сразу после энумерации устройства на шине я в ер1 помещаю данные и подтверждаю их. После этого мой usb-монитор фиксирует передачу данных в хост (блоки по 64 байта). Я подозреваю, что так, как это interrupt ep1 то хост с выбранным мною периодом опроса контролирует эту ер1 и если там есть данные -забирает их. Теперь вот очень хотелось-бы узнать корректная ли это передача без input-репортов, если да - то куда эти данные сохраняются в компьютере и как их оттуда можно считать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После этого мой usb-монитор фиксирует передачу данных в хост (блоки по 64 байта). Я подозреваю, что так, как это interrupt ep1 то хост с выбранным мною периодом опроса контролирует эту ер1 и если там есть данные -забирает их.

 

Правильно подозреваете. Надеюсь, что Ваш Device Full Speed, т.к. PayLoad в 64 байта допускается

только для Full Speed InterruptEP, для Low Speed - только 8 байт.

 

Теперь вот очень хотелось-бы узнать корректная ли это передача без input-репортов, если да - то куда эти данные сохраняются в компьютере и как их оттуда можно считать.

 

Не пойму на какие "input-репорты" Вы рассчитываете? В соответствии с USB спецификацией все

InterruptEP исключительно однонаправленные и работают на передачу в Host. Host сам в состоянии

определить корректность полученных данных по CRC16 в DATA пакете и подтвердить его ACK-ом

если усё OK или запросить повторную пересылку.

Данные эти сохраняются знамо куда - в приемный буфер драйвера HID-устройства, который OS-ка

подгрузила для обслуживания Вашего Device. А вытащить их оттуда можно, написав программку,

которая будет вызывать функцию чтения буфера драйвера... Однако в этом направлении я еще

глубоко не копал, т.к. постройка USB-Device - это у меня следующим этапом. Пока гораздо актуальней

доделать Embedded Host для общения с Flash-накопителями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

"Не пойму на какие "input-репорты" Вы рассчитываете?"

 

Я как пример использовал hid-устройство из книги Агурова "Интерфейс USB: практика использования и программирования". Он своё устройство сделал таким образом, что конечную точку он загружал в любой момент времени, а отсылал только по запросу hid-класса get_report (0xA101) в котором поле wValue определяет тип репорта: 01-input, 02-output, 03-feature. Вот это меня и запутало.

 

Спасибо за консультацию. Теперь буду напрягать нашего системного программиста - пусть пишет программу для считывания моих данных из буффера драйвера.

 

Успехов Вам в создании контроллера для флэшки. Скорее всего моим следующим этапом работы будет создание чего-то подобного на основе OTG-контроллера AT90USB647 или ISP1362.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...