Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите подправить USB HID дескриптор
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Memento Mori
Господа, осваиваю 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 байта?
Сергей Борщ
QUOTE (Memento Mori @ Nov 20 2012, 22:05) *
Как передать репорт в 2 байта?
Обратите внимание на строку с REPORT_SIZE (8)
Memento Mori
Сергей, задавая вопросы я параллельно курю Агурова. Книжка ядреная, раскуривается с трудом. Я уже понял, что репортсайз это размер в битах, а репорткаунт это количество байт. Когда я ставлю количество байт 8, в удивительной программе хосте появляется 8 полей для ввьда байт. Но при отправке 8 байт программа хост уходит в себя. Что еще нужно менять в прошивке контроллера при изменении дескриптора?
Сергей Борщ
Я не смотрел этот пример. Могу предположить, что надо где-то указать сколько памяти зарезервировать под этот репорт и сколько байтов программа должна из стека принять.
Memento Mori
Сергей, выкладываю проекты.
ДЛя компа проект на Дельфи, но к нему вопросов нет, вещь универсальная, анализирует дескриптор и сама выстраивает логику общения с HID устройством.
Гляньте, если вам не трудно, 4-й день бьюсь и бестолку.

Ура! Нашел! В самой библиотеке в инициализации ендпоинтов подправил count - заработало.
Memento Mori
С записью разобрался.
Помогите вкурить про чтение.

ИЗначально пример был настроен на отправку данных от хоста и получение от устройства показаний АЦП, по прерыванию.
По факту жмешь кнопку "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 начинает бесконечно посылать в ответ пакеты.
А мне и АЦП отключить бы (а низзя, без кода в обработчиках прерываний не работает).

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

Тоже STM32F103. У кейла на форуме нашел ответ на Ваш вопрос. Корректировкой 3-4 строк передаю/принимаю по 64 байта в пакете. Вопрос еще актуален?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.