реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103RC USB HID
dimon_rub
сообщение May 15 2017, 07:04
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



Здравствуйте.
Возникла проблема и похоже без Вашей помощи не могу решить уже несколько недель.
Нужно HID устройство для загрузки конфигурации с ширеной 32байта (по спецификации макс. 64байта).
Долго бился и до чего дошел:
- опреределение устройства на стороне PC без проблем
- запись в устройство методом SetFeature длинной в 32 байта

Не получается:
- чтение не одним из методов (GetFeature у STM32 не реализован, не знаю как сделать)
- запись методом SetReport (если начинаю срезать длинну до 4байт то норма).

Report:
CODE

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 */







Go to the top of the page
 
+Quote Post
dimon_rub
сообщение May 15 2017, 12:12
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



Ну кто нибудь. Хотя бы как нужно вызывать ответ от STM32F103 методом Get_Feature.
В примере от ST функция пустая
CODE

/*******************************************************************************
* Function Name : HID_Status_Out
* Description : HID status OUT routine.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void HID_Status_Out (void)
{

}

Go to the top of the page
 
+Quote Post
prottoss
сообщение May 15 2017, 12:36
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 671
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dimon_rub @ May 15 2017, 13:04) *

Я не понял - у Вас не получается отправлять данные на стороне РС?


--------------------
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение May 16 2017, 08:20
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



Да.
Проблема решена частично.
Нашел вот такую purebasic.mybb.ru/viewtopic.php?id=592. Там есть пример
и на его основе сделал Get_Feature. (ОГРОМНОЕ СПАСИБО АВТОРУ).

Сейчас работает методом Feature и чтение и записть.
Методом Report только запись в STM. С чтением пока борюсь.
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 16 2017, 12:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 671
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dimon_rub @ May 16 2017, 14:20) *
Да.
Проблема решена частично.
Нашел вот такую purebasic.mybb.ru/viewtopic.php?id=592. Там есть пример
и на его основе сделал Get_Feature. (ОГРОМНОЕ СПАСИБО АВТОРУ).

Сейчас работает методом Feature и чтение и записть.
Методом Report только запись в STM. С чтением пока борюсь.
Попробуйте работать не через штатную для Windows HID.DLL а через CreateFile/ReadFile/WriteFile.
Для этого нужно через функции интерфейса Win32 SetupAPI получить путь к устройству, понятный CreateFile.
Далее пишем читаем репорты через ReadFile/WriteFile. Тут как удобно - можно синхронно, можно асинхронно.


--------------------
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение May 16 2017, 21:25
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



Цитата(prottoss @ May 16 2017, 12:07) *
Попробуйте работать не через штатную для Windows HID.DLL а через CreateFile/ReadFile/WriteFile.
Для этого нужно через функции интерфейса Win32 SetupAPI получить путь к устройству, понятный CreateFile.
Далее пишем читаем репорты через ReadFile/WriteFile. Тут как удобно - можно синхронно, можно асинхронно.


Да. Спасибо. Я все это знаю. Читал Агурова + есть исходники PickIt. Получены указатели на чтение и запись. WriteFile
заработала а ReadFile ну никак. Смотрю снифером даже обращения к порту нет. (ЕСТЬ ПОДОЗРЕНИЕ ЧТО ЧТОТО С РАЗМЕРАМИ БУФЕРОВ).
Еще в поиске. Может кто что подскажет.
.

Сообщение отредактировал dimon_rub - May 16 2017, 21:27
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 17 2017, 12:10
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 671
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dimon_rub @ May 17 2017, 03:25) *
Да. Спасибо. Я все это знаю.

Размер читаемых-записываемых данных должен быть равен размеру репорта. Первый байт репорта - ID репорта.

Дескриптор Вашего устройства смотрел - вроде косяков нет.


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2017 - 10:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016