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

 
 
> Помогите подправить 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
 
Start new topic
Ответов
Memento Mori
сообщение Nov 21 2012, 19:40
Сообщение #2


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

Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 21:20
Рейтинг@Mail.ru


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