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

STM32F103RC USB HID

Здравствуйте.

Возникла проблема и похоже без Вашей помощи не могу решить уже несколько недель.

Нужно 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 */

 

 

 

 

 

 

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


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

Ну кто нибудь. Хотя бы как нужно вызывать ответ от 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)
{

}

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


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

Да.

Проблема решена частично.

Нашел вот такую purebasic.mybb.ru/viewtopic.php?id=592. Там есть пример

и на его основе сделал Get_Feature. (ОГРОМНОЕ СПАСИБО АВТОРУ).

 

Сейчас работает методом Feature и чтение и записть.

Методом Report только запись в STM. С чтением пока борюсь.

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


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

Да.

Проблема решена частично.

Нашел вот такую purebasic.mybb.ru/viewtopic.php?id=592. Там есть пример

и на его основе сделал Get_Feature. (ОГРОМНОЕ СПАСИБО АВТОРУ).

 

Сейчас работает методом Feature и чтение и записть.

Методом Report только запись в STM. С чтением пока борюсь.

Попробуйте работать не через штатную для Windows HID.DLL а через CreateFile/ReadFile/WriteFile.

Для этого нужно через функции интерфейса Win32 SetupAPI получить путь к устройству, понятный CreateFile.

Далее пишем читаем репорты через ReadFile/WriteFile. Тут как удобно - можно синхронно, можно асинхронно.

 

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


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

Попробуйте работать не через штатную для Windows HID.DLL а через CreateFile/ReadFile/WriteFile.

Для этого нужно через функции интерфейса Win32 SetupAPI получить путь к устройству, понятный CreateFile.

Далее пишем читаем репорты через ReadFile/WriteFile. Тут как удобно - можно синхронно, можно асинхронно.

 

Да. Спасибо. Я все это знаю. Читал Агурова + есть исходники PickIt. Получены указатели на чтение и запись. WriteFile

заработала а ReadFile ну никак. Смотрю снифером даже обращения к порту нет. (ЕСТЬ ПОДОЗРЕНИЕ ЧТО ЧТОТО С РАЗМЕРАМИ БУФЕРОВ).

Еще в поиске. Может кто что подскажет.

.

Изменено пользователем dimon_rub

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


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

Да. Спасибо. Я все это знаю.

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

 

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

 

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


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

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

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

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

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

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

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

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

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

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