diff options
Diffstat (limited to 'tmk_core')
-rw-r--r-- | tmk_core/protocol/vusb/vusb.c | 58 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/vusb.h | 12 |
2 files changed, 70 insertions, 0 deletions
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 0b91bfb414..69f2c12e3f 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -346,6 +346,10 @@ const PROGMEM uchar mouse_extra_hid_report[] = { }; #endif +#ifndef SERIAL_NUMBER +# define SERIAL_NUMBER 0 +#endif + #ifndef USB_MAX_POWER_CONSUMPTION # define USB_MAX_POWER_CONSUMPTION 500 #endif @@ -355,6 +359,40 @@ const PROGMEM uchar mouse_extra_hid_report[] = { # define USB_POLLING_INTERVAL_MS 1 #endif +// clang-format off +const PROGMEM usbStringDescriptor_t usbDescriptorStringZero = { + .header = { + .bLength = USB_STRING_LEN(1), + .bDescriptorType = USBDESCR_STRING + }, + .bString = {0x0409} // US English +}; + +const PROGMEM usbStringDescriptor_t usbDescriptorStringManufacturer = { + .header = { + .bLength = USB_STRING_LEN(sizeof(STR(MANUFACTURER)) - 1), + .bDescriptorType = USBDESCR_STRING + }, + .bString = LSTR(MANUFACTURER) +}; + +const PROGMEM usbStringDescriptor_t usbDescriptorStringProduct = { + .header = { + .bLength = USB_STRING_LEN(sizeof(STR(PRODUCT)) - 1), + .bDescriptorType = USBDESCR_STRING + }, + .bString = LSTR(PRODUCT) +}; + +const PROGMEM usbStringDescriptor_t usbDescriptorStringSerial = { + .header = { + .bLength = USB_STRING_LEN(sizeof(STR(SERIAL_NUMBER)) - 1), + .bDescriptorType = USBDESCR_STRING + }, + .bString = LSTR(SERIAL_NUMBER) +}; +// clang-format on + /* * Descriptor for compite device: Keyboard + Mouse * @@ -468,6 +506,26 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) { len = sizeof(usbDescriptorConfiguration); break; #endif + case USBDESCR_STRING: + switch (rq->wValue.bytes[0]) { + case 0: + usbMsgPtr = (unsigned char *)&usbDescriptorStringZero; + len = usbDescriptorStringZero.header.bLength; + break; + case 1: // iManufacturer + usbMsgPtr = (unsigned char *)&usbDescriptorStringManufacturer; + len = usbDescriptorStringManufacturer.header.bLength; + break; + case 2: // iProduct + usbMsgPtr = (unsigned char *)&usbDescriptorStringProduct; + len = usbDescriptorStringProduct.header.bLength; + break; + case 3: // iSerialNumber + usbMsgPtr = (unsigned char *)&usbDescriptorStringSerial; + len = usbDescriptorStringSerial.header.bLength; + break; + } + break; case USBDESCR_HID: switch (rq->wValue.bytes[0]) { case 0: diff --git a/tmk_core/protocol/vusb/vusb.h b/tmk_core/protocol/vusb/vusb.h index 7e3f8c394d..cee07207a3 100644 --- a/tmk_core/protocol/vusb/vusb.h +++ b/tmk_core/protocol/vusb/vusb.h @@ -20,6 +20,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "host_driver.h" +typedef struct usbDescriptorHeader { + uchar bLength; + uchar bDescriptorType; +} __attribute__((packed)) usbDescriptorHeader_t; + +typedef struct usbStringDescriptor { + usbDescriptorHeader_t header; + int bString[]; +} __attribute__((packed)) usbStringDescriptor_t; + +#define USB_STRING_LEN(s) (sizeof(usbDescriptorHeader_t) + ((s) << 1)) + host_driver_t *vusb_driver(void); void vusb_transfer_keyboard(void); |