]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
fix USB descriptors
authorpwpiwi <pwpiwi@users.noreply.github.com>
Mon, 24 Apr 2017 12:19:39 +0000 (14:19 +0200)
committerpwpiwi <pwpiwi@users.noreply.github.com>
Mon, 24 Apr 2017 12:19:39 +0000 (14:19 +0200)
- indicate compliance with USB release 2.0
- set correct vendor and product IDs
- indicate power consumption (500mA)
- add String Descriptor 0 indicating supported languages
- add String Descriptors for Manufacturer and Product

common/usb_cdc.c

index 7fd2933c322463f5d5790b9397d5c7aeb8d3b72a..5577e354965215f72c3f56fe03217ce364a744d1 100644 (file)
  */\r
 \r
 #include "usb_cdc.h"\r
+#include "at91sam7s512.h"\r
 #include "config_gpio.h"\r
 \r
-#define MIN(a, b) (((a) < (b)) ? (a) : (b))\r
-#define MAX(a, b) (((a) > (b)) ? (a) : (b))\r
 #define AT91C_EP_IN_SIZE  0x40\r
 #define AT91C_EP_OUT         1\r
 #define AT91C_EP_OUT_SIZE 0x40\r
 #define AT91C_EP_IN          2\r
 \r
-const char devDescriptor[] = {\r
+static const char devDescriptor[] = {\r
        /* Device descriptor */\r
        0x12,      // bLength\r
        0x01,      // bDescriptorType\r
-       0x10,0x01, // Complies with USB Spec. Release (0110h = release 1.10)\r
+       0x00,0x02, // Complies with USB Spec. Release (0200h = release 2.0)\r
        0x02,      // bDeviceClass:    CDC class code\r
        0x00,      // bDeviceSubclass: CDC class sub code\r
        0x00,      // bDeviceProtocol: CDC Device protocol\r
        0x08,      // bMaxPacketSize0\r
-       0x2d,0x2d, // Vendor ID (--)\r
-       0x4d,0x50, // Product ID (PM), transmitted in reverse\r
+       0xc4,0x9a, // Vendor ID (0x9ac4 = J. Westhues)\r
+       0x8f,0x4b, // Product ID (0x4b8f = Proxmark-3 RFID Instrument)\r
        0x01,0x00, // Device release number (0001)\r
-       0x01,      // iManufacturer    // 0x01\r
-       0x00,      // iProduct\r
-       0x00,      // SerialNumber\r
+       0x01,      // iManufacturer\r
+       0x02,      // iProduct\r
+       0x00,      // iSerialNumber\r
        0x01       // bNumConfigs\r
 };\r
 \r
-const char cfgDescriptor[] = {\r
+static const char cfgDescriptor[] = {\r
        /* ============== CONFIGURATION 1 =========== */\r
        /* Configuration 1 descriptor */\r
        0x09,   // CbLength\r
@@ -71,7 +70,7 @@ const char cfgDescriptor[] = {
        0x01,   // CbConfigurationValue\r
        0x00,   // CiConfiguration\r
        0xC0,   // CbmAttributes 0xA0\r
-       0x00,   // CMaxPower\r
+       0xFA,   // CMaxPower\r
 \r
        /* Communication Class Interface Descriptor Requirement */\r
        0x09, // bLength\r
@@ -81,7 +80,7 @@ const char cfgDescriptor[] = {
        0x01, // bNumEndpoints\r
        0x02, // bInterfaceClass\r
        0x02, // bInterfaceSubclass\r
-       0x00, // bInterfaceProtocol\r
+       0x01, // bInterfaceProtocol\r
        0x00, // iInterface\r
 \r
        /* Header Functional Descriptor */\r
@@ -95,7 +94,7 @@ const char cfgDescriptor[] = {
        0x04, // bFunctionLength\r
        0x24, // bDescriptor Type: CS_INTERFACE\r
        0x02, // bDescriptor Subtype: ACM Func Desc\r
-       0x00, // bmCapabilities\r
+       0x02, // bmCapabilities\r
 \r
        /* Union Functional Descriptor */\r
        0x05, // bFunctionLength\r
@@ -151,8 +150,14 @@ const char cfgDescriptor[] = {
        0x00    // bInterval\r
 };\r
 \r
-const char strDescriptor[] = {\r
-  26,                          // Length\r
+static const char StrDescLanguageCodes[] = {\r
+  4,                   // Length\r
+  0x03,                        // Type is string\r
+  0x09, 0x04   // supported language Code 0 = 0x0409 (English)\r
+};\r
+       \r
+static const char StrDescManufacturer[] = {\r
+  26,                  // Length\r
   0x03,                        // Type is string\r
   'p', 0x00,\r
   'r', 0x00,\r
@@ -165,9 +170,32 @@ const char strDescriptor[] = {
   '.', 0x00,\r
   'o', 0x00,\r
   'r', 0x00,\r
-  'g', 0x00,\r
+  'g', 0x00\r
+};\r
+\r
+static const char StrDescProduct[] = {\r
+  8,                   // Length\r
+  0x03,                        // Type is string\r
+  'P', 0x00,\r
+  'M', 0x00,\r
+  '3', 0x00\r
+};\r
+       \r
+static const char* const pStrings[] =\r
+{\r
+    StrDescLanguageCodes,\r
+    StrDescManufacturer,\r
+       StrDescProduct\r
 };\r
 \r
+const char* getStringDescriptor(uint8_t idx)\r
+{\r
+    if(idx >= (sizeof(pStrings) / sizeof(pStrings[0]))) {\r
+        return(NULL);\r
+       } else {\r
+               return(pStrings[idx]);\r
+       }\r
+}\r
 \r
 /* USB standard request code */\r
 #define STD_GET_STATUS_ZERO           0x0080\r
@@ -480,8 +508,14 @@ void AT91F_CDC_Enumerate() {
                        AT91F_USB_SendData(pUdp, devDescriptor, MIN(sizeof(devDescriptor), wLength));\r
                else if (wValue == 0x200)  // Return Configuration Descriptor\r
                        AT91F_USB_SendData(pUdp, cfgDescriptor, MIN(sizeof(cfgDescriptor), wLength));\r
-               else if ((wValue & 0x300) == 0x300)  // Return String Descriptor\r
-                       AT91F_USB_SendData(pUdp, strDescriptor, MIN(sizeof(strDescriptor), wLength));\r
+               else if ((wValue & 0xF00) == 0x300) { // Return String Descriptor\r
+                       const char *strDescriptor = getStringDescriptor(wValue & 0xff);\r
+                       if (strDescriptor != NULL) {\r
+                               AT91F_USB_SendData(pUdp, strDescriptor, MIN(strDescriptor[0], wLength));\r
+                       } else {\r
+                               AT91F_USB_SendStall(pUdp);\r
+                       }\r
+               }\r
                else\r
                        AT91F_USB_SendStall(pUdp);\r
                break;\r
Impressum, Datenschutz