aboutsummaryrefslogtreecommitdiffstats
path: root/src/generic/usb_cdc.c
diff options
context:
space:
mode:
authorMatt Baker <baker.matt.j@gmail.com>2019-11-21 08:54:20 -0800
committerKevinOConnor <kevin@koconnor.net>2019-11-21 11:54:20 -0500
commitbab27651a1cda4897f307e9bd5198774f4efad45 (patch)
tree91aeb970907b8f56572f24d5617cc796bf223e13 /src/generic/usb_cdc.c
parentb0a158c27118468beaecc185fb55fd457c764f5d (diff)
downloadkutter-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.c31
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();
}