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

Помогите подправить USB HID дескриптор

Господа, осваиваю USB.

Пытаюсь подружить STM32F и ПК.

Взял пример от STM - для устройства и пример USB HID из JVCL.

 

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

 

Собственно, проблема в чем - один байт я пересылать научился, а вот 2 никак не получается.

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

ПРичем программа хитрая, если я в дескрипторе HID устройства пишу REPORT_COUNT =2, то в программе после подключения к устройству появляется два поля для репортов.

 

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


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

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


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

Как передать репорт в 2 байта?
Обратите внимание на строку с REPORT_SIZE (8)

 

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


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

Сергей, задавая вопросы я параллельно курю Агурова. Книжка ядреная, раскуривается с трудом. Я уже понял, что репортсайз это размер в битах, а репорткаунт это количество байт. Когда я ставлю количество байт 8, в удивительной программе хосте появляется 8 полей для ввьда байт. Но при отправке 8 байт программа хост уходит в себя. Что еще нужно менять в прошивке контроллера при изменении дескриптора?

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


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

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

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


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

Сергей, выкладываю проекты.

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

Гляньте, если вам не трудно, 4-й день бьюсь и бестолку.

 

Ура! Нашел! В самой библиотеке в инициализации ендпоинтов подправил count - заработало.

Custom_HID.rar

ReadWriteDemo.rar

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


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

С записью разобрался.

Помогите вкурить про чтение.

 

ИЗначально пример был настроен на отправку данных от хоста и получение от устройства показаний АЦП, по прерыванию.

По факту жмешь кнопку "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 начинает бесконечно посылать в ответ пакеты.

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

 

Ткните носом куда-нибудь кроме учебника, который я сейчас читаю.

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


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

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

 

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


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

ау люди помогите! Мне один шаг всего остался.

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

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


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

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

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

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

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

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

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

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

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

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