diff options
author | Matt Baker <baker.matt.j@gmail.com> | 2019-11-21 08:54:20 -0800 |
---|---|---|
committer | KevinOConnor <kevin@koconnor.net> | 2019-11-21 11:54:20 -0500 |
commit | bab27651a1cda4897f307e9bd5198774f4efad45 (patch) | |
tree | 91aeb970907b8f56572f24d5617cc796bf223e13 /src/generic/usb_cdc.c | |
parent | b0a158c27118468beaecc185fb55fd457c764f5d (diff) | |
download | kutter-bab27651a1cda4897f307e9bd5198774f4efad45.tar.gz kutter-bab27651a1cda4897f307e9bd5198774f4efad45.tar.xz kutter-bab27651a1cda4897f307e9bd5198774f4efad45.zip |
lpc176x: read chip id and use as usb serial. (#2184)
Signed-off-by: Matt Baker <baker.matt.j@gmail.com>
Diffstat (limited to 'src/generic/usb_cdc.c')
-rw-r--r-- | src/generic/usb_cdc.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/generic/usb_cdc.c b/src/generic/usb_cdc.c index c995db49..fa1c5cb1 100644 --- a/src/generic/usb_cdc.c +++ b/src/generic/usb_cdc.c @@ -358,21 +358,34 @@ usb_req_get_descriptor(struct usb_ctrlrequest *req) { if (req->bRequestType != USB_DIR_IN) goto fail; - uint_fast8_t i; + void *desc = NULL; + uint_fast8_t flags, size, i; for (i=0; i<ARRAY_SIZE(cdc_descriptors); i++) { const struct descriptor_s *d = &cdc_descriptors[i]; if (READP(d->wValue) == req->wValue && READP(d->wIndex) == req->wIndex) { - uint_fast8_t size = READP(d->size); - uint_fast8_t flags = NEED_PROGMEM ? UX_SEND_PROGMEM : UX_SEND; - if (size > req->wLength) - size = req->wLength; - else if (size < req->wLength) - flags |= UX_SEND_ZLP; - usb_do_xfer((void*)READP(d->desc), size, flags); - return; + flags = NEED_PROGMEM ? UX_SEND_PROGMEM : UX_SEND; + size = READP(d->size); + desc = (void*)READP(d->desc); } } + if (CONFIG_USB_SERIAL_NUMBER_CHIPID + && req->wValue == ((USB_DT_STRING<<8) | USB_STR_ID_SERIAL) + && req->wIndex == USB_LANGID_ENGLISH_US) { + struct usb_string_descriptor *usbserial_serialid; + usbserial_serialid = usbserial_get_serialid(); + flags = UX_SEND; + size = usbserial_serialid->bLength; + desc = (void*)usbserial_serialid; + } + if (desc) { + if (size > req->wLength) + size = req->wLength; + else if (size < req->wLength) + flags |= UX_SEND_ZLP; + usb_do_xfer(desc, size, flags); + return; + } fail: usb_do_stall(); } |