138 lines
4.1 KiB
C
138 lines
4.1 KiB
C
#include "usbd_core.h"
|
|
#include "usbd_desc.h"
|
|
#include "usbd_conf.h"
|
|
|
|
#define DFU_VID 0x1209U
|
|
#define DFU_PID 0xE667U
|
|
#define DFU_LANGID 0x0409U
|
|
#define DFU_MANUFACTURER_STRING "ERTOtech"
|
|
#define DFU_PRODUCT_STRING "Refleks Lite DFU"
|
|
#define DFU_CONFIG_STRING "DFU Config"
|
|
#define DFU_INTERFACE_STRING "DFU Interface"
|
|
|
|
static uint8_t *DFU_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
|
static uint8_t *DFU_LangIdDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
|
static uint8_t *DFU_ManufacturerDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
|
static uint8_t *DFU_ProductDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
|
static uint8_t *DFU_SerialDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
|
static uint8_t *DFU_ConfigDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
|
static uint8_t *DFU_InterfaceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
|
static void DFU_UpdateSerial(void);
|
|
static void DFU_IntToUnicode(uint32_t value, uint8_t *buffer, uint8_t length);
|
|
|
|
USBD_DescriptorsTypeDef FS_Desc =
|
|
{
|
|
DFU_DeviceDescriptor,
|
|
DFU_LangIdDescriptor,
|
|
DFU_ManufacturerDescriptor,
|
|
DFU_ProductDescriptor,
|
|
DFU_SerialDescriptor,
|
|
DFU_ConfigDescriptor,
|
|
DFU_InterfaceDescriptor,
|
|
};
|
|
|
|
__ALIGN_BEGIN static uint8_t dfuDeviceDescriptor[USB_LEN_DEV_DESC] __ALIGN_END =
|
|
{
|
|
USB_LEN_DEV_DESC, USB_DESC_TYPE_DEVICE,
|
|
0x00, 0x02,
|
|
0x00, 0x00, 0x00,
|
|
USB_MAX_EP0_SIZE,
|
|
LOBYTE(DFU_VID), HIBYTE(DFU_VID),
|
|
LOBYTE(DFU_PID), HIBYTE(DFU_PID),
|
|
0x00, 0x01,
|
|
USBD_IDX_MFC_STR,
|
|
USBD_IDX_PRODUCT_STR,
|
|
USBD_IDX_SERIAL_STR,
|
|
0x01,
|
|
};
|
|
|
|
__ALIGN_BEGIN static uint8_t dfuLangIdDescriptor[USB_LEN_LANGID_STR_DESC] __ALIGN_END =
|
|
{
|
|
USB_LEN_LANGID_STR_DESC, USB_DESC_TYPE_STRING,
|
|
LOBYTE(DFU_LANGID), HIBYTE(DFU_LANGID),
|
|
};
|
|
|
|
__ALIGN_BEGIN static uint8_t dfuStringDescriptor[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
|
|
__ALIGN_BEGIN static uint8_t dfuSerialDescriptor[USB_SIZ_STRING_SERIAL] __ALIGN_END =
|
|
{
|
|
USB_SIZ_STRING_SERIAL, USB_DESC_TYPE_STRING,
|
|
};
|
|
|
|
static uint8_t *DFU_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
|
|
{
|
|
UNUSED(speed);
|
|
*length = sizeof(dfuDeviceDescriptor);
|
|
return dfuDeviceDescriptor;
|
|
}
|
|
|
|
static uint8_t *DFU_LangIdDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
|
|
{
|
|
UNUSED(speed);
|
|
*length = sizeof(dfuLangIdDescriptor);
|
|
return dfuLangIdDescriptor;
|
|
}
|
|
|
|
static uint8_t *DFU_ManufacturerDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
|
|
{
|
|
UNUSED(speed);
|
|
USBD_GetString((uint8_t *)DFU_MANUFACTURER_STRING, dfuStringDescriptor, length);
|
|
return dfuStringDescriptor;
|
|
}
|
|
|
|
static uint8_t *DFU_ProductDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
|
|
{
|
|
UNUSED(speed);
|
|
USBD_GetString((uint8_t *)DFU_PRODUCT_STRING, dfuStringDescriptor, length);
|
|
return dfuStringDescriptor;
|
|
}
|
|
|
|
static uint8_t *DFU_SerialDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
|
|
{
|
|
UNUSED(speed);
|
|
DFU_UpdateSerial();
|
|
*length = sizeof(dfuSerialDescriptor);
|
|
return dfuSerialDescriptor;
|
|
}
|
|
|
|
static uint8_t *DFU_ConfigDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
|
|
{
|
|
UNUSED(speed);
|
|
USBD_GetString((uint8_t *)DFU_CONFIG_STRING, dfuStringDescriptor, length);
|
|
return dfuStringDescriptor;
|
|
}
|
|
|
|
static uint8_t *DFU_InterfaceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
|
|
{
|
|
UNUSED(speed);
|
|
USBD_GetString((uint8_t *)DFU_INTERFACE_STRING, dfuStringDescriptor, length);
|
|
return dfuStringDescriptor;
|
|
}
|
|
|
|
static void DFU_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)
|
|
{
|
|
DFU_IntToUnicode(serial0, &dfuSerialDescriptor[2], 8U);
|
|
DFU_IntToUnicode(serial1, &dfuSerialDescriptor[18], 4U);
|
|
}
|
|
}
|
|
|
|
static void DFU_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;
|
|
}
|
|
}
|