Initial minikbd mod

This commit is contained in:
jaseg 2020-06-22 23:58:20 +02:00
parent e81e214e02
commit 0aa7b8871e
4 changed files with 155 additions and 289 deletions

View file

@ -95,7 +95,7 @@
#define HID_REPORT_DESC_SIZE (47+HID_MEDIA_SIZE+HID_LED_SIZE)
#define HID_REPORT_DESC_SIZE 104
#define HID_DESCRIPTOR_TYPE 0x21

View file

@ -1,4 +1,6 @@
#include <stdbool.h>
#include "main.h"
#include "usb_device.h"
#include "usbd_hid.h"
@ -13,12 +15,13 @@ PCD_HandleTypeDef hpcd_USB_FS;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC_Init(void);
static void MX_USB_PCD_Init(void);
void sendVolDown(void);
void sendVolUp(void);
enum keybits {
KEYBITS_VOL_UP = 0x20,
KEYBITS_VOL_DOWN = 0x40,
};
void sendKeybits(uint8_t keybits);
struct key_t
{
@ -32,94 +35,69 @@ uint16_t ADCreg[8];
uint16_t ADCval[8];
uint16_t ADClast[8];
/* FIXME debug remove */
TIM_TypeDef *tim1 = TIM1;
TIM_TypeDef *tim3 = TIM3;
int main(void)
{
HAL_Init();
HAL_Init();
SystemClock_Config();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC_Init();
MX_USB_HID_INIT();
MX_GPIO_Init();
MX_USB_HID_INIT();
HAL_ADC_Start_DMA(&hadc, ADCreg, 8);
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM3_CLK_ENABLE();
while (1)
{
TIM1->SMCR = 3; // Encoder mode 3
TIM1->CCER = 0; // rising edge polarity
TIM1->ARR = 0xFFFF; // count from 0-ARR or ARR-0
TIM1->CCMR1 = 0x0101; // f_DTS/16, N=8, IC1->TI1, IC2->TI2
TIM1->CNT = 0; // Initialize counter
TIM1->EGR = 1; // Generate an update event
TIM1->CR1 = 1; // Enable the counter
TIM3->SMCR = 3; // Encoder mode 3
TIM3->CCER = 0; // rising edge polarity
TIM3->ARR = 0xFFFF; // count from 0-ARR or ARR-0
TIM3->CCMR1 = 0x0101; // f_DTS/16, N=8, IC1->TI1, IC2->TI2
TIM3->CNT = 0; // Initialize counter
TIM3->EGR = 1; // Generate an update event
TIM3->CR1 = 1; // Enable the counter
for(int i = 0; i < 8; i++){
ADCval[i] = ADCreg[i];
if(ADCval[i] - ADClast[i] > 2000 || ADClast[i] - ADCval[i] > 2000 ) ADClast[i] = ADCval[i];
uint16_t tim1_last = TIM1->CNT, tim3_last = TIM3->CNT;
int vol_delta = 0;
bool tx_vol_reset = 0;
while (1) {
uint16_t tim1_now = TIM1->CNT, tim3_now = TIM3->CNT;
int16_t tim1_delta = (int16_t)(tim1_now - tim1_last);
int16_t tim3_delta = (int16_t)(tim3_now - tim3_last);
vol_delta += tim3_delta - tim1_delta;
#define VOL_DELTA_INC 4
uint8_t keybits = 0;
if (!tx_vol_reset) {
if (vol_delta >= VOL_DELTA_INC) {
keybits |= KEYBITS_VOL_UP;
vol_delta -= VOL_DELTA_INC;
tx_vol_reset = 1;
} else if (vol_delta <= -VOL_DELTA_INC) {
keybits |= KEYBITS_VOL_DOWN;
vol_delta += VOL_DELTA_INC;
tx_vol_reset = 1;
}
} else {
tx_vol_reset = 0;
}
sendKeybits(keybits);
tim1_last = tim1_now;
tim3_last = tim3_now;
HAL_Delay(10);
}
// Volume Dial 8
if(ADCval[0] >= ADClast[0] + HYSTERESIS){
sendVolUp();
ADClast[0] = ADCval[0];
} else if(ADCval[0] <= ADClast[0] - HYSTERESIS){
sendVolDown();
ADClast[0] = ADCval[0];
}
// Dial 1
if(ADCval[1] >= ADClast[1] + HYSTERESIS){
} else if(ADCval[1] <= ADClast[1] - HYSTERESIS){
}
// SwitchLayer
if(ADCval[2] >= ADClast[2] + HYSTERESIS){
sendChar('v');
ADClast[2] = ADCval[2];
} else if(ADCval[2] <= ADClast[2] - HYSTERESIS){
sendChar('v');
ADClast[2] = ADCval[2];
}
// RotatePart Dial 3
if(ADCval[3] >= ADClast[3] + HYSTERESIS){
sendChar('R');
ADClast[3] = ADCval[3];
} else if(ADCval[3] <= ADClast[3] - HYSTERESIS){
sendChar('r');
ADClast[3] = ADCval[3];
}
// Grid Dial 4
if(ADCval[4] >= ADClast[4] + HYSTERESIS){
sendChar('n');
ADClast[4] = ADCval[4];
} else if(ADCval[4] <= ADClast[4] - HYSTERESIS){
sendChar('N');
ADClast[4] = ADCval[4];
}
// via
if(ADCval[5] >= ADClast[5] + HYSTERESIS){
} else if(ADCval[5] <= ADClast[5] - HYSTERESIS){
}
// Trackwidth Dial 6
if(ADCval[6] >= ADClast[6] + HYSTERESIS){
sendChar('w');
ADClast[6] = ADCval[6];
} else if(ADCval[6] <= ADClast[6] - HYSTERESIS){
sendChar('W');
ADClast[6] = ADCval[6];
}
// zoom
if(ADCval[7] >= ADClast[7] + HYSTERESIS){
sendCharWrong(0x3a);
ADClast[7] = ADCval[7];
} else if(ADCval[7] <= ADClast[7] - HYSTERESIS){
sendCharWrong(0x3b);
ADClast[7] = ADCval[7];
}
HAL_Delay(10);
}
}
@ -293,154 +271,58 @@ void sendCharWrong(uint8_t ch){
HAL_Delay(10);
}
void sendVolUp(){
uint8_t report[3];
report[0]= HID_MEDIA_REPORT;
report[1]= 0xE9;
report[2]= 0x00;
USBD_HID_SendReport(&hUsbDeviceFS, report, 3);
HAL_Delay(10);
report[0]= HID_MEDIA_REPORT;
report[1]= 0x00;
report[2]= 0x00;
USBD_HID_SendReport(&hUsbDeviceFS, report, 3);
}
void sendVolDown(){
uint8_t report[3];
report[0]= HID_MEDIA_REPORT;
report[1]= 0xEA;
report[2]= 0x00;
USBD_HID_SendReport(&hUsbDeviceFS, report, 3);
HAL_Delay(10);
report[0]= HID_MEDIA_REPORT;
report[1]= 0x00;
report[2]= 0x00;
USBD_HID_SendReport(&hUsbDeviceFS, report, 3);
void sendKeybits(uint8_t keybits){
uint8_t report[2];
report[0]= HID_MEDIA_REPORT;
report[1]= keybits;
USBD_HID_SendReport(&hUsbDeviceFS, report, 2);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_HSI48;
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
RCC_OscInitStruct.HSI14CalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_HSI48;
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
RCC_OscInitStruct.HSI14CalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
}
static void MX_ADC_Init(void)
{
static void MX_GPIO_Init(void) {
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
ADC_ChannelConfTypeDef sConfig = {0};
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DMAContinuousRequests = ENABLE;
hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
HAL_ADC_Init(&hadc);
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
sConfig.Channel = ADC_CHANNEL_1;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_2;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_3;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_4;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_5;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_6;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_7;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_8;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}
static void MX_USB_PCD_Init(void)
{
hpcd_USB_FS.Instance = USB;
hpcd_USB_FS.Init.dev_endpoints = 8;
hpcd_USB_FS.Init.speed = PCD_SPEED_FULL;
hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
hpcd_USB_FS.Init.low_power_enable = DISABLE;
hpcd_USB_FS.Init.lpm_enable = DISABLE;
hpcd_USB_FS.Init.battery_charging_enable = DISABLE;
HAL_PCD_Init(&hpcd_USB_FS);
}
static void MX_DMA_Init(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIOA->MODER = 0x28000000 | (2<<(8*2)) | (2<<(9*2));
GPIOB->MODER = (2<<(4*2)) | (2<<(5*2));
GPIOA->PUPDR = 0x24000000 | (1<<(8*2)) | (1<<(9*2));
GPIOB->PUPDR = (1<<(4*2)) | (1<<(5*2));
GPIOA->AFR[1]= 0x00000022;
GPIOB->AFR[0]= 0x00110000;
}
void Error_Handler(void)
{
while(1){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_Delay(100);
}
while(1){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_Delay(100);
}
}

View file

@ -100,12 +100,12 @@
************************************************************************************************************
*/
#define USBD_VID 0x1209 //MUST BE CHANGED.
#define USBD_VID 0x1209
#define USBD_LANGID_STRING 1041
#define USBD_MANUFACTURER_STRING "Otter Scientific"
#define USBD_PID_FS 0x0001 //MUST BE CHANGED.
#define USBD_PRODUCT_STRING_FS "HID Dials"
#define USBD_SERIALNUMBER_STRING_FS "00000000001A"
#define USBD_MANUFACTURER_STRING "jaseg.de"
#define USBD_PID_FS 0x0002 // FIXME
#define USBD_PRODUCT_STRING_FS "MultiHID"
#define USBD_SERIALNUMBER_STRING_FS "000000000001"
#define USBD_CONFIGURATION_STRING_FS "HID Config"
#define USBD_INTERFACE_STRING_FS "HID Interface"

View file

@ -152,7 +152,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_
0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
/************** Descriptor of Joystick Mouse interface ****************/
/* Interface descriptor */
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
@ -165,7 +165,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_
0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of Joystick Mouse HID ********************/
/* HID descriptor */
/* 18 */
0x09, /*bLength: HID Descriptor size*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
@ -176,7 +176,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_
0x22, /*bDescriptorType*/
HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Mouse endpoint ********************/
/* HID endpoint descriptor */
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
@ -233,29 +233,21 @@ __ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_
__ALIGN_BEGIN static uint8_t HID_ReportDesc[HID_REPORT_DESC_SIZE] __ALIGN_END =
{
//copy from arduino code https://github.com/arduino-libraries/Keyboard/blob/master/src/Keyboard.cpp
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report ID (1)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0xE0, // Usage Minimum (0xE0)
0x29, 0xE7, // Usage Maximum (0xE7)
// it seam we missed the shit ctrl etc .. here
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
#if HID_LED_SUPPORT
// --------------------- output report for LED
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, /* Report ID */
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
@ -265,50 +257,42 @@ __ALIGN_BEGIN static uint8_t HID_ReportDesc[HID_REPORT_DESC_SIZE] __ALIGN_END =
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
#endif
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x65, // Logical Maximum (101)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0x00, // Usage Minimum (0x00)
0x29, 0x65, // Usage Maximum (0x65)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 47 bytes
#if HID_MEDIA_REPORT
//help from http://www.microchip.com/forums/m618147.aspx
// this way of describing and sending media control is convenient
// short descriptor that permit all kidn meda by sending "usage" code
// see usb hid spec for full list
// it is possible to define one media key per bit it requires more space
// for descripotor and report ending is tighlyu couple to decriptor
// so it is not as convenient
// one such working code can be find here https://github.com/markwj/hidmedia/blob/master/hidmedia.X/usb_descriptors.c
//
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, HID_MEDIA_REPORT, // Report ID (VOLUME_REPORT )
0x19, 0x00, // Usage Minimum (Unassigned)
0x2A, 0x3C, 0x02, // Usage Maximum (AC Format)
0x15, 0x00, // Logical Minimum (0)
0x26, 0x3C, 0x02, // Logical Maximum (572)
0x95, 0x01, // Report Count (1)
0x75, 0x10, // Report Size (16)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0, // End Collection
//
0x05, 0x0C, /* Usage Page (Consumer Devices) */
0x09, 0x01, /* Usage (Consumer Control) */
0xA1, 0x01, /* Collection (Application) */
0x85, 0x02, /* Report ID=2 */
0x05, 0x0C, /* Usage Page (Consumer Devices) */
0x15, 0x00, /* Logical Minimum (0) */
0x25, 0x01, /* Logical Maximum (1) */
0x75, 0x01, /* Report Size (1) */
0x95, 0x07, /* Report Count (7) */
0x09, 0xB5, /* Usage (Scan Next Track) */
0x09, 0xB6, /* Usage (Scan Previous Track) */
0x09, 0xB7, /* Usage (Stop) */
0x09, 0xCD, /* Usage (Play / Pause) */
0x09, 0xE2, /* Usage (Mute) */
0x09, 0xE9, /* Usage (Volume Up) */
0x09, 0xEA, /* Usage (Volume Down) */
0x81, 0x02, /* Input (Data, Variable, Absolute) */
0x95, 0x01, /* Report Count (1) */
0x81, 0x01, /* Input (Constant) */
0xC0, // End Collection
// how to format the 3 byte report
// byte 0 report ID = 0x02 (VOLUME_REPORT)
// byte 1 media code for ex VOL_UP 0xE9 , VOL_DONW 0xEA ... etc
// byte 2 0x00
// a second report with 0 code shal be send to avoid "key repaeat"
// 25 bytes
#endif
};
uint32_t nOutData;