Files

157 lines
5.0 KiB
C

#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
#define DINPUT_VID 0x1209U
#define DINPUT_PID 0xE669U
#define DINPUT_LANGID 0x0409U
#define DINPUT_MANUFACTURER_STRING "ERTOtech"
#define DINPUT_PRODUCT_STRING "Refleks Lite DInput"
#define DINPUT_CONFIGURATION_STRING "HID Config"
#define DINPUT_INTERFACE_STRING "Gamepad"
static uint8_t *DInput_DeviceDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length);
static uint8_t *DInput_LangIdDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length);
static uint8_t *DInput_ManufacturerDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length);
static uint8_t *DInput_ProductDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length);
static uint8_t *DInput_SerialDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length);
static uint8_t *DInput_ConfigurationDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length);
static uint8_t *DInput_InterfaceDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length);
static void DInput_UpdateSerial(void);
static void DInput_IntToUnicode(uint32_t value, uint8_t *buffer,
uint8_t length);
USBD_DescriptorsTypeDef FS_Desc =
{
DInput_DeviceDescriptor,
DInput_LangIdDescriptor,
DInput_ManufacturerDescriptor,
DInput_ProductDescriptor,
DInput_SerialDescriptor,
DInput_ConfigurationDescriptor,
DInput_InterfaceDescriptor,
};
__ALIGN_BEGIN static uint8_t dinputDeviceDescriptor[USB_LEN_DEV_DESC] __ALIGN_END =
{
USB_LEN_DEV_DESC, USB_DESC_TYPE_DEVICE,
0x00, 0x02,
0x00, 0x00, 0x00,
USB_MAX_EP0_SIZE,
LOBYTE(DINPUT_VID), HIBYTE(DINPUT_VID),
LOBYTE(DINPUT_PID), HIBYTE(DINPUT_PID),
0x00, 0x01,
USBD_IDX_MFC_STR,
USBD_IDX_PRODUCT_STR,
USBD_IDX_SERIAL_STR,
0x01,
};
__ALIGN_BEGIN static uint8_t dinputLangIdDescriptor[USB_LEN_LANGID_STR_DESC] __ALIGN_END =
{
USB_LEN_LANGID_STR_DESC, USB_DESC_TYPE_STRING,
LOBYTE(DINPUT_LANGID), HIBYTE(DINPUT_LANGID),
};
__ALIGN_BEGIN static uint8_t dinputStringDescriptor[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
__ALIGN_BEGIN static uint8_t dinputSerialDescriptor[USB_SIZ_STRING_SERIAL] __ALIGN_END =
{
USB_SIZ_STRING_SERIAL, USB_DESC_TYPE_STRING,
};
static uint8_t *DInput_DeviceDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length)
{
UNUSED(speed);
*length = sizeof(dinputDeviceDescriptor);
return dinputDeviceDescriptor;
}
static uint8_t *DInput_LangIdDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length)
{
UNUSED(speed);
*length = sizeof(dinputLangIdDescriptor);
return dinputLangIdDescriptor;
}
static uint8_t *DInput_ManufacturerDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length)
{
UNUSED(speed);
USBD_GetString((uint8_t *)DINPUT_MANUFACTURER_STRING,
dinputStringDescriptor, length);
return dinputStringDescriptor;
}
static uint8_t *DInput_ProductDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length)
{
UNUSED(speed);
USBD_GetString((uint8_t *)DINPUT_PRODUCT_STRING,
dinputStringDescriptor, length);
return dinputStringDescriptor;
}
static uint8_t *DInput_SerialDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length)
{
UNUSED(speed);
DInput_UpdateSerial();
*length = sizeof(dinputSerialDescriptor);
return dinputSerialDescriptor;
}
static uint8_t *DInput_ConfigurationDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length)
{
UNUSED(speed);
USBD_GetString((uint8_t *)DINPUT_CONFIGURATION_STRING,
dinputStringDescriptor, length);
return dinputStringDescriptor;
}
static uint8_t *DInput_InterfaceDescriptor(USBD_SpeedTypeDef speed,
uint16_t *length)
{
UNUSED(speed);
USBD_GetString((uint8_t *)DINPUT_INTERFACE_STRING,
dinputStringDescriptor, length);
return dinputStringDescriptor;
}
static void DInput_UpdateSerial(void)
{
uint32_t serial0 = *(uint32_t *)DEVICE_ID1;
uint32_t serial1 = *(uint32_t *)DEVICE_ID2;
uint32_t serial2 = *(uint32_t *)DEVICE_ID3;
serial0 += serial2;
if (serial0 != 0U)
{
DInput_IntToUnicode(serial0, &dinputSerialDescriptor[2], 8U);
DInput_IntToUnicode(serial1, &dinputSerialDescriptor[18], 4U);
}
}
static void DInput_IntToUnicode(uint32_t value, uint8_t *buffer,
uint8_t length)
{
uint8_t index;
for (index = 0U; index < length; index++)
{
uint8_t digit = (uint8_t)(value >> 28);
buffer[2U * index] = (digit < 10U) ?
(uint8_t)(digit + '0') :
(uint8_t)(digit - 10U + 'A');
buffer[(2U * index) + 1U] = 0U;
value <<= 4;
}
}