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

 
 
 
Reply to this topicStart new topic
> Помогите подправить USB HID дескриптор
Memento Mori
сообщение Nov 20 2012, 20:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 1-10-12
Пользователь №: 73 751



Господа, осваиваю USB.
Пытаюсь подружить STM32F и ПК.
Взял пример от STM - для устройства и пример USB HID из JVCL.

ПРимер от STM хитромудреный, но чтобы получить хоть что-то мне проще поковырять его, чем писать с нуля.

Собственно, проблема в чем - один байт я пересылать научился, а вот 2 никак не получается.
ПРограмма на компьютере думает, что CurrentDevice.Caps.OutputReportByteLength равен единице и не передает больше одного байта, несмотря на то что я в форму вбиваю 2.
ПРичем программа хитрая, если я в дескрипторе HID устройства пишу REPORT_COUNT =2, то в программе после подключения к устройству появляется два поля для репортов.

ВОт дескриптор:
CODE


const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
{
0x05, 0x8c, /* USAGE_PAGE (ST Page) */
0x09, 0x01, /* USAGE (Demo Kit) */
0xa1, 0x01, /* COLLECTION (Application) */
/* 6 */

/* Led 1 */
0x85, 0x01, /* REPORT_ID (1) */
0x09, 0x01, /* USAGE (LED 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 (LED 1) */
0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */
/* 26 */

/* Led 2 */
0x85, 0x02, /* REPORT_ID 2 */
0x09, 0x02, /* USAGE (LED 2) */
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, 0x02, /* REPORT_ID (2) */
0x09, 0x02, /* USAGE (LED 2) */
0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */
/* 46 */

/* Led 3 */
0x85, 0x03, /* REPORT_ID (3) */
0x09, 0x03, /* USAGE (LED 3) */
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, 0x03, /* REPORT_ID (3) */
0x09, 0x03, /* USAGE (LED 3) */
0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */
/* 66 */

/* Led 4 */
0x85, 0x08, /* REPORT_ID 4) */
0x09, 0x08, /* USAGE (LED 4) */
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, 0x08, /* REPORT_ID (4) */
0x09, 0x09, /* USAGE (LED 4) */
0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */
/* 86 */

/* key Push Button */
0x85, 0x05, /* REPORT_ID (5) */
0x09, 0x05, /* USAGE (Push Button) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */

0x09, 0x05, /* USAGE (Push Button) */
0x75, 0x01, /* REPORT_SIZE (1) */
0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */

0x75, 0x07, /* REPORT_SIZE (7) */
0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */
0x85, 0x05, /* REPORT_ID (2) */

0x75, 0x07, /* REPORT_SIZE (7) */
0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */
/* 114 */

/* Tamper Push Button */
0x85, 0x06, /* REPORT_ID (6) */
0x09, 0x06, /* USAGE (Tamper Push Button) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */

0x09, 0x06, /* USAGE (Tamper Push Button) */
0x75, 0x01, /* REPORT_SIZE (1) */
0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */

0x75, 0x07, /* REPORT_SIZE (7) */
0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */
0x85, 0x06, /* REPORT_ID (6) */

0x75, 0x07, /* REPORT_SIZE (7) */
0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */
/* 142 */

/* ADC IN */
0x85, 0x07, /* REPORT_ID (7) */
0x09, 0x07, /* USAGE (ADC IN) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */
0x75, 0x08, /* REPORT_SIZE (8) */
0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */
0x85, 0x07, /* REPORT_ID (7) */
0x09, 0x07, /* USAGE (ADC in) */
0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */
/* 161 */

0xc0 /* END_COLLECTION */
}; /* CustomHID_ReportDescriptor */



В этом дескрипторе я использую ReportID 1.

Как передать репорт в 2 байта?

Сообщение отредактировал Memento Mori - Nov 20 2012, 20:11
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2012, 23:59
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Memento Mori @ Nov 20 2012, 22:05) *
Как передать репорт в 2 байта?
Обратите внимание на строку с REPORT_SIZE (8)


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Memento Mori
сообщение Nov 21 2012, 12:11
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 1-10-12
Пользователь №: 73 751



Сергей, задавая вопросы я параллельно курю Агурова. Книжка ядреная, раскуривается с трудом. Я уже понял, что репортсайз это размер в битах, а репорткаунт это количество байт. Когда я ставлю количество байт 8, в удивительной программе хосте появляется 8 полей для ввьда байт. Но при отправке 8 байт программа хост уходит в себя. Что еще нужно менять в прошивке контроллера при изменении дескриптора?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 21 2012, 13:02
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Я не смотрел этот пример. Могу предположить, что надо где-то указать сколько памяти зарезервировать под этот репорт и сколько байтов программа должна из стека принять.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Memento Mori
сообщение Nov 21 2012, 13:45
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 1-10-12
Пользователь №: 73 751



Сергей, выкладываю проекты.
ДЛя компа проект на Дельфи, но к нему вопросов нет, вещь универсальная, анализирует дескриптор и сама выстраивает логику общения с HID устройством.
Гляньте, если вам не трудно, 4-й день бьюсь и бестолку.

Ура! Нашел! В самой библиотеке в инициализации ендпоинтов подправил count - заработало.
Прикрепленные файлы
Прикрепленный файл  Custom_HID.rar ( 623.43 килобайт ) Кол-во скачиваний: 30
Прикрепленный файл  ReadWriteDemo.rar ( 11.76 килобайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
Memento Mori
сообщение Nov 21 2012, 19:40
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 1-10-12
Пользователь №: 73 751



С записью разобрался.
Помогите вкурить про чтение.

ИЗначально пример был настроен на отправку данных от хоста и получение от устройства показаний АЦП, по прерыванию.
По факту жмешь кнопку "Write", хост отправляет данные и принимает в ответ показания АЦП.
Вот код, мной покоцанный. ПРосто сейчас чищу этот пример, удаляя все лишнее, насколько это возможно.

Код
/*******************************************************************************
* Function Name  : DMA1_Channel1_IRQHandler
* Description    : This function handles DMA1 Channel 1 interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void DMA1_Channel1_IRQHandler(void)
{  
  
  Send_Buffer[0] = 0x01;
  
  if((ADC_ConvertedValueX >>4) - (ADC_ConvertedValueX_1 >>4) > 4)
  {
    Send_Buffer[1] = (uint8_t)(ADC_ConvertedValueX >>4);
    
  USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 8);  

    SetEPTxValid(ENDP1);


    ADC_ConvertedValueX_1 = ADC_ConvertedValueX;
  }
  
  DMA_ClearFlag(DMA1_FLAG_TC1);
  
}

/*******************************************************************************
* Function Name  : EXTI9_5_IRQHandler
* Description    : This function handles External lines 9 to 5 interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EXTI9_5_IRQHandler(void)
{

  Send_Buffer[0]=0xCC;
Send_Buffer[1]=0xCC;
Send_Buffer[2]=0xCC;
  USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 8);  
    SetEPTxValid(ENDP1);
    EXTI_ClearITPendingBit(KEY_BUTTON_EXTI_LINE);

}

/*******************************************************************************
* Function Name  : EXTI15_10_IRQHandler
* Description    : This function handles External lines 15 to 10 interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EXTI15_10_IRQHandler(void)
{

  Send_Buffer[0]=0xCC;
Send_Buffer[1]=0xCC;
Send_Buffer[2]=0xCC;

  USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 8);  
    SetEPTxValid(ENDP1);
    EXTI_ClearITPendingBit(TAMPER_BUTTON_EXTI_LINE);
  
}



А я хочу, чтобы HID устройство помещало в Endpoint данные ПОСЛЕ получения данных от хоста, то есть чтобы было что-то вроде Хост: "Привет"; HID: "И тебе привет"

Вот что я сделал:
Код
void EP2_IN_Callback(void)
{
    WriteString(0,150,"DDDDDDDDDDDDd",0x001F);
    Transi_Buffer[0]=0x01;
Transi_Buffer[1]=0xCC;
Transi_Buffer[2]=0xCC;
  USB_SIL_Write(EP1_IN, (uint8_t*) Transi_Buffer, 8);  
    SetEPTxValid(ENDP1);


}


В результате этого HID начинает бесконечно посылать в ответ пакеты.
А мне и АЦП отключить бы (а низзя, без кода в обработчиках прерываний не работает).

Ткните носом куда-нибудь кроме учебника, который я сейчас читаю.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 22 2012, 07:23
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Memento Mori @ Nov 21 2012, 21:40) *
Ткните носом куда-нибудь кроме учебника, который я сейчас читаю.
Я все это дело изучал с год назад разбираясь с исходниками v-usb (ногодрыгательный usb-device на AVR). Изучал читая описание USB, описание HID с сайта usb.org, книгу "USB complete", автор Jan Axelson и расставляя в интересующих меня местах исходника printf с выводом нужных переменных в UART. Сделал тот проект и, увы, уже многое забыл. Пусть вам поможет кто-то другой, кто более плотно этим занимается.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Memento Mori
сообщение Nov 22 2012, 10:15
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 1-10-12
Пользователь №: 73 751



ау люди помогите! Мне один шаг всего остался.
Go to the top of the page
 
+Quote Post
smk
сообщение Jan 29 2013, 19:56
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(Memento Mori @ Nov 22 2012, 12:15) *
ау люди помогите! Мне один шаг всего остался.

Тоже STM32F103. У кейла на форуме нашел ответ на Ваш вопрос. Корректировкой 3-4 строк передаю/принимаю по 64 байта в пакете. Вопрос еще актуален?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 11:38
Рейтинг@Mail.ru


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