diff --git a/CH32V203/src/main.c b/CH32V203/src/main.c index 8c67e46..a71a2fb 100644 --- a/CH32V203/src/main.c +++ b/CH32V203/src/main.c @@ -59,6 +59,7 @@ void SysTick_Handler(void) } +void int_to_unicode(uint32_t value , uint8_t *pbuf , uint8_t len); void USB_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; @@ -67,6 +68,15 @@ void USB_Config(void) RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); + /* update serial number string with chip unique ID */ + extern uint8_t USBD_StringSerial []; + uint32_t serial0 = *(uint32_t*)0x1FFFF7E8; + uint32_t serial1 = *(uint32_t*)0x1FFFF7EC; + uint32_t serial2 = *(uint32_t*)0x1FFFF7F0; + + int_to_unicode(serial0 + serial2, &USBD_StringSerial[2], 8); + int_to_unicode(serial1 + serial2, &USBD_StringSerial[18], 4); + USB_Init(); NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; @@ -143,3 +153,22 @@ void Delay_Ms(uint32_t n) for(int i = 0; i < SystemCoreClock / 4000 * n; i++) __NOP(); } + +void int_to_unicode(uint32_t value , uint8_t *pbuf , uint8_t len) +{ + for(int i = 0 ; i < len ; i++) + { + if((value >> 28) < 0xA) + { + pbuf[2 * i] = (value >> 28) + '0'; + } + else + { + pbuf[2 * i] = (value >> 28) + 'A' - 10; + } + + pbuf[2 * i + 1] = 0; + + value = value << 4; + } +} diff --git a/CH32V305/src/USBD/usb_desc.c b/CH32V305/src/USBD/usb_desc.c index c519d09..e9bd4a8 100644 --- a/CH32V305/src/USBD/usb_desc.c +++ b/CH32V305/src/USBD/usb_desc.c @@ -402,7 +402,7 @@ const uint8_t USB_StringProduct[] = /* Serial Number Descriptor */ -const uint8_t USB_StringSerialNbr[] = +uint8_t USB_StringSerialNbr[] = { USB_SIZE_STRING_SERIALNBR, USB_DESCR_TYP_STRING, diff --git a/CH32V305/src/USBD/usb_desc.h b/CH32V305/src/USBD/usb_desc.h index 0dd60c9..d6567cc 100644 --- a/CH32V305/src/USBD/usb_desc.h +++ b/CH32V305/src/USBD/usb_desc.h @@ -62,7 +62,7 @@ extern const uint8_t USB_CfgDesc_HS[]; extern const uint8_t USB_StringLangID[]; extern const uint8_t USB_StringVendor[]; extern const uint8_t USB_StringProduct[]; -extern const uint8_t USB_StringSerialNbr[]; +extern uint8_t USB_StringSerialNbr[]; extern const uint8_t USB_QualifierDesc[]; extern const uint8_t HID_ReportDesc_FS[]; extern const uint8_t HID_ReportDesc_HS[]; diff --git a/CH32V305/src/main.c b/CH32V305/src/main.c index c52d27a..78a68ac 100644 --- a/CH32V305/src/main.c +++ b/CH32V305/src/main.c @@ -11,7 +11,7 @@ volatile uint32_t SysTick_ms = 0; void SysTick_Config(uint32_t ticks); - +void int_to_unicode(uint32_t value , uint8_t *pbuf , uint8_t len); void main(void) { @@ -19,6 +19,15 @@ void main(void) VCOM_Init(); + /* update serial number string with chip unique ID */ + extern uint8_t USB_StringSerialNbr[]; + uint32_t serial0 = *(uint32_t*)0x1FFFF7E8; + uint32_t serial1 = *(uint32_t*)0x1FFFF7EC; + uint32_t serial2 = *(uint32_t*)0x1FFFF7F0; + + int_to_unicode(serial0 + serial2, &USB_StringSerialNbr[2], 8); + int_to_unicode(serial1 + serial2, &USB_StringSerialNbr[18], 4); + USBHS_RCC_Init(); USBHS_Device_Init(ENABLE); @@ -52,3 +61,23 @@ void SysTick_Handler(void) SysTick_ms++; } + + +void int_to_unicode(uint32_t value , uint8_t *pbuf , uint8_t len) +{ + for(int i = 0 ; i < len ; i++) + { + if((value >> 28) < 0xA) + { + pbuf[2 * i] = (value >> 28) + '0'; + } + else + { + pbuf[2 * i] = (value >> 28) + 'A' - 10; + } + + pbuf[2 * i + 1] = 0; + + value = value << 4; + } +}