dimon_rub 0 15 мая, 2017 Опубликовано 15 мая, 2017 · Жалоба Здравствуйте. Возникла проблема и похоже без Вашей помощи не могу решить уже несколько недель. Нужно HID устройство для загрузки конфигурации с ширеной 32байта (по спецификации макс. 64байта). Долго бился и до чего дошел: - опреределение устройства на стороне PC без проблем - запись в устройство методом SetFeature длинной в 32 байта Не получается: - чтение не одним из методов (GetFeature у STM32 не реализован, не знаю как сделать) - запись методом SetReport (если начинаю срезать длинну до 4байт то норма). Report: const uint8_t RHID_ConfigDescriptor[RHID_SIZ_CONFIG_DESC] = { 0x09, // bLength: длина дескриптора конфигурации USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: тип дескриптора - конфигурация RHID_SIZ_CONFIG_DESC, 0x00, // wTotalLength: общий размер всего дерева под данной конфигурацией в байтах 0x01, // bNumInterfaces: в конфигурации всего один интерфейс 0x01, // bConfigurationValue: индекс данной конфигурации 0x00, // iConfiguration: индекс строки, которая описывает эту конфигурацию 0xC0, // bmAttributes: признак того, что устройство будет питаться от шины USB 0x32, // MaxPower 100 mA: и ему хватит 100 мА /************** Дескриптор интерфейса ****************/ 0x09, // bLength: размер дескриптора интерфейса USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: тип дескриптора - интерфейс 0x00, // bInterfaceNumber: порядковый номер интерфейса - 0 0x00, // bAlternateSetting: признак альтернативного интерфейса, у нас не используется 0x02, // bNumEndpoints - количество эндпоинтов. 0x03, // bInterfaceClass: класс интерфеса - HID 0x00, // bInterfaceSubClass : подкласс интерфейса. 0x00, // nInterfaceProtocol : протокол интерфейса 0, // iInterface: индекс строки, описывающей интерфейс // теперь отдельный дескриптор для уточнения того, что данный интерфейс - это HID устройство /******************** HID дескриптор ********************/ 0x09, // bLength: длина HID-дескриптора HID_DESCRIPTOR_TYPE, // bDescriptorType: тип дескриптора - HID 0x01, 0x01, // bcdHID: номер версии HID 1.1 0x00, // bCountryCode: код страны (если нужен) 0x01, // bNumDescriptors: Сколько дальше будет report дескрипторов HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType: Тип дескриптора - report RHID_SIZ_REPORT_DESC, 0x00, // wItemLength: длина report-дескриптора /******************** дескриптор конечных точек (endpoints) ********************/ 0x07, // bLength: длина дескриптора USB_ENDPOINT_DESCRIPTOR_TYPE, // тип дескриптора - endpoints 0x81, // bEndpointAddress: адрес конечной точки и направление 1(IN) 0x03, // bmAttributes: тип конечной точки - Interrupt endpoint RHID_SIZ_REPORT_IN, 0x00, // wMaxPacketSize: Bytes max 0x20, // bInterval: Polling Interval (32 ms) 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ /* Endpoint descriptor type */ 0x01, /* bEndpointAddress: */ /* Endpoint Address (OUT) */ 0x03, /* bmAttributes: Interrupt endpoint */ RHID_SIZ_REPORT_OUT, //wMaxPacketSize, /* wMaxPacketSize: Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (32 ms) */ }; /* RHID_ConfigDescriptor */ const uint8_t RHID_ReportDescriptor[RHID_SIZ_REPORT_DESC] = { // 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x06, 0xFF, 0x00, /* USAGE_PAGE (Vendor Page: 0xFF00) */ 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, //!!!!! REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */ 0x75, 0x08, // REPORT_SIZE (8) 0x95, RHID_SIZ_REPORT_IN, // REPORT_COUNT (32) 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, /* USAGE (Vendor Usage 2) */ 0x81, 0x82, // INPUT (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (1) 0x09, 0x03, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RHID_SIZ_REPORT_OUT, //!!!!! REPORT_COUNT (32) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (1) 0x09, 0x03, // USAGE (Vendor Usage 1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0xc0 // END_COLLECTION } ; /* RHID_ReportDescriptor */ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 15 мая, 2017 Опубликовано 15 мая, 2017 · Жалоба Ну кто нибудь. Хотя бы как нужно вызывать ответ от STM32F103 методом Get_Feature. В примере от ST функция пустая /******************************************************************************* * Function Name : HID_Status_Out * Description : HID status OUT routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void HID_Status_Out (void) { } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 15 мая, 2017 Опубликовано 15 мая, 2017 · Жалоба Я не понял - у Вас не получается отправлять данные на стороне РС? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 16 мая, 2017 Опубликовано 16 мая, 2017 · Жалоба Да. Проблема решена частично. Нашел вот такую purebasic.mybb.ru/viewtopic.php?id=592. Там есть пример и на его основе сделал Get_Feature. (ОГРОМНОЕ СПАСИБО АВТОРУ). Сейчас работает методом Feature и чтение и записть. Методом Report только запись в STM. С чтением пока борюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 16 мая, 2017 Опубликовано 16 мая, 2017 · Жалоба Да. Проблема решена частично. Нашел вот такую purebasic.mybb.ru/viewtopic.php?id=592. Там есть пример и на его основе сделал Get_Feature. (ОГРОМНОЕ СПАСИБО АВТОРУ). Сейчас работает методом Feature и чтение и записть. Методом Report только запись в STM. С чтением пока борюсь. Попробуйте работать не через штатную для Windows HID.DLL а через CreateFile/ReadFile/WriteFile. Для этого нужно через функции интерфейса Win32 SetupAPI получить путь к устройству, понятный CreateFile. Далее пишем читаем репорты через ReadFile/WriteFile. Тут как удобно - можно синхронно, можно асинхронно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 16 мая, 2017 Опубликовано 16 мая, 2017 (изменено) · Жалоба Попробуйте работать не через штатную для Windows HID.DLL а через CreateFile/ReadFile/WriteFile. Для этого нужно через функции интерфейса Win32 SetupAPI получить путь к устройству, понятный CreateFile. Далее пишем читаем репорты через ReadFile/WriteFile. Тут как удобно - можно синхронно, можно асинхронно. Да. Спасибо. Я все это знаю. Читал Агурова + есть исходники PickIt. Получены указатели на чтение и запись. WriteFile заработала а ReadFile ну никак. Смотрю снифером даже обращения к порту нет. (ЕСТЬ ПОДОЗРЕНИЕ ЧТО ЧТОТО С РАЗМЕРАМИ БУФЕРОВ). Еще в поиске. Может кто что подскажет. . Изменено 16 мая, 2017 пользователем dimon_rub Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 17 мая, 2017 Опубликовано 17 мая, 2017 · Жалоба Да. Спасибо. Я все это знаю. Размер читаемых-записываемых данных должен быть равен размеру репорта. Первый байт репорта - ID репорта. Дескриптор Вашего устройства смотрел - вроде косяков нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться