summaryrefslogtreecommitdiff
path: root/tmk_core
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/protocol/vusb/vusb.c58
-rw-r--r--tmk_core/protocol/vusb/vusb.h12
2 files changed, 70 insertions, 0 deletions
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index 79e8cf71b8..30c9708921 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -335,6 +335,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
@@ -344,6 +348,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
*
@@ -457,6 +495,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);