aboutsummaryrefslogtreecommitdiffstats
path: root/src/lpc176x
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2019-11-25 00:12:56 -0500
committerKevin O'Connor <kevin@koconnor.net>2019-11-25 18:32:52 -0500
commitf76cb92b15afbb5022696bf20c7a0172e3c6f834 (patch)
treee81a0f63ac4ab8650b8b15fc4a6c6a3ddd3c98a4 /src/lpc176x
parentbd6c25c9f8c28831d146f9077a0a2aa636c6e037 (diff)
downloadkutter-f76cb92b15afbb5022696bf20c7a0172e3c6f834.tar.gz
kutter-f76cb92b15afbb5022696bf20c7a0172e3c6f834.tar.xz
kutter-f76cb92b15afbb5022696bf20c7a0172e3c6f834.zip
usb_cdc: Add a usb_fill_serial() helper function
Add a helper function to fill the usb serial string descriptor. Use it in the lpc176x code. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/lpc176x')
-rw-r--r--src/lpc176x/usbserial.c37
1 files changed, 14 insertions, 23 deletions
diff --git a/src/lpc176x/usbserial.c b/src/lpc176x/usbserial.c
index 54c28a31..6e1cd77b 100644
--- a/src/lpc176x/usbserial.c
+++ b/src/lpc176x/usbserial.c
@@ -111,16 +111,6 @@ sie_select_and_clear(uint32_t idx)
/****************************************************************
* Interface
****************************************************************/
-#define USB_STR_SERIAL_CHIPID u"0123456789ABCDEF0123456789ABCDEF"
-
-#define SIZE_cdc_string_serial_chipid \
- (sizeof(cdc_string_serial_chipid) + sizeof(USB_STR_SERIAL_CHIPID) - 2)
-
-static struct usb_string_descriptor cdc_string_serial_chipid = {
- .bLength = SIZE_cdc_string_serial_chipid,
- .bDescriptorType = USB_DT_STRING,
- .data = USB_STR_SERIAL_CHIPID,
-};
static int_fast8_t
usb_write_packet(uint32_t ep, const void *data, uint_fast8_t len)
@@ -277,35 +267,37 @@ usb_request_bootloader(void)
NVIC_SystemReset();
}
+static struct {
+ struct usb_string_descriptor desc;
+ uint16_t data[IAP_UID_LEN * 2];
+} cdc_chipid;
+
struct usb_string_descriptor *
usbserial_get_serialid(void)
{
- return &cdc_string_serial_chipid;
+ return &cdc_chipid.desc;
}
+
/****************************************************************
* Setup and interrupts
****************************************************************/
+
static void
usb_set_serial(void)
{
+ if (!CONFIG_USB_SERIAL_NUMBER_CHIPID)
+ return;
+
uint32_t iap_cmd_uid[5] = {IAP_CMD_READ_UID, 0, 0, 0, 0};
uint32_t iap_resp[5];
-
IAP iap_entry = (IAP)IAP_LOCATION;
__disable_irq();
iap_entry(iap_cmd_uid, iap_resp);
__enable_irq();
- uint8_t *chipid = (uint8_t *)&iap_resp[1];
- uint8_t i, j, c;
- for (i = 0; i < IAP_UID_LEN; i++) {
- for (j = 0; j < 2; j++) {
- c = (chipid[i] >> 4*j) & 0xF;
- c = (c < 10) ? '0'+c : 'A'-10+c;
- cdc_string_serial_chipid.data[2*i+((j)?0:1)] = c;
- }
- }
+ usb_fill_serial(&cdc_chipid.desc, ARRAY_SIZE(cdc_chipid.data)
+ , &iap_resp[1]);
}
void
@@ -343,8 +335,7 @@ DECL_CONSTANT_STR("RESERVE_PINS_USB", "P0.30,P0.29,P2.9");
void
usbserial_init(void)
{
- if (CONFIG_USB_SERIAL_NUMBER_CHIPID)
- usb_set_serial();
+ usb_set_serial();
usb_irq_disable();
// enable power