USBHost library. NOTE: This library is only officially supported on the LPC1768 platform. For more information, please see the handbook page.

Dependencies:   FATFileSystem mbed-rtos

Dependents:   BTstack WallbotWii SD to Flash Data Transfer USBHost-MSD_HelloWorld ... more

Legacy Warning

This is an mbed 2 library. To learn more about mbed OS 5, visit the docs.

Pull requests against this repository are no longer supported. Please raise against mbed OS 5 as documented above.

Revision:
37:f1e388e7b752
Parent:
24:868cbfe611a7
--- a/USBHostHID/USBHostKeyboard.cpp	Sun Apr 30 04:17:16 2017 +0000
+++ b/USBHostHID/USBHostKeyboard.cpp	Thu Jul 20 10:13:56 2017 +0100
@@ -19,71 +19,81 @@
 #if USBHOST_KEYBOARD
 
 static uint8_t keymap[4][0x39] = {
-    { 0, 0, 0, 0, 'a', 'b' /*0x05*/,
-      'c', 'd', 'e', 'f', 'g' /*0x0a*/,
-      'h', 'i', 'j', 'k', 'l'/*0x0f*/,
-      'm', 'n', 'o', 'p', 'q'/*0x14*/,
-      'r', 's', 't', 'u', 'v'/*0x19*/,
-      'w', 'x', 'y', 'z', '1'/*0x1E*/,
-      '2', '3', '4', '5', '6'/*0x23*/,
-      '7', '8', '9', '0', 0x0A /*enter*/, /*0x28*/
-      0x1B /*escape*/, 0x08 /*backspace*/, 0x09/*tab*/, 0x20/*space*/, '-', /*0x2d*/
-      '=', '[', ']', '\\', '#', /*0x32*/
-      ';', '\'', 0, ',', '.', /*0x37*/
-      '/'},
+    {
+        0, 0, 0, 0, 'a', 'b' /*0x05*/,
+        'c', 'd', 'e', 'f', 'g' /*0x0a*/,
+        'h', 'i', 'j', 'k', 'l'/*0x0f*/,
+        'm', 'n', 'o', 'p', 'q'/*0x14*/,
+        'r', 's', 't', 'u', 'v'/*0x19*/,
+        'w', 'x', 'y', 'z', '1'/*0x1E*/,
+        '2', '3', '4', '5', '6'/*0x23*/,
+        '7', '8', '9', '0', 0x0A /*enter*/, /*0x28*/
+        0x1B /*escape*/, 0x08 /*backspace*/, 0x09/*tab*/, 0x20/*space*/, '-', /*0x2d*/
+        '=', '[', ']', '\\', '#', /*0x32*/
+        ';', '\'', 0, ',', '.', /*0x37*/
+        '/'
+    },
 
     /* CTRL MODIFIER */
-    { 0, 0, 0, 0, 0, 0 /*0x05*/,
-      0, 0, 0, 0, 0 /*0x0a*/,
-      0, 0, 0, 0, 0/*0x0f*/,
-      0, 0, 0, 0, 0/*0x14*/,
-      0, 0, 0, 0, 0/*0x19*/,
-      0, 0, 0, 0, 0/*0x1E*/,
-      0, 0, 0, 0, 0/*0x23*/,
-      0, 0, 0, 0, 0 /*enter*/, /*0x28*/
-      0, 0, 0, 0, 0, /*0x2d*/
-      0, 0, 0, 0, 0, /*0x32*/
-      0, 0, 0, 0, 0, /*0x37*/
-      0},
+    {
+        0, 0, 0, 0, 0, 0 /*0x05*/,
+        0, 0, 0, 0, 0 /*0x0a*/,
+        0, 0, 0, 0, 0/*0x0f*/,
+        0, 0, 0, 0, 0/*0x14*/,
+        0, 0, 0, 0, 0/*0x19*/,
+        0, 0, 0, 0, 0/*0x1E*/,
+        0, 0, 0, 0, 0/*0x23*/,
+        0, 0, 0, 0, 0 /*enter*/, /*0x28*/
+        0, 0, 0, 0, 0, /*0x2d*/
+        0, 0, 0, 0, 0, /*0x32*/
+        0, 0, 0, 0, 0, /*0x37*/
+        0
+    },
 
     /* SHIFT MODIFIER */
-    { 0, 0, 0, 0, 'A', 'B' /*0x05*/,
-      'C', 'D', 'E', 'F', 'G' /*0x0a*/,
-      'H', 'I', 'J', 'K', 'L'/*0x0f*/,
-      'M', 'N', 'O', 'P', 'Q'/*0x14*/,
-      'R', 'S', 'T', 'U', 'V'/*0x19*/,
-      'W', 'X', 'Y', 'Z', '!'/*0x1E*/,
-      '@', '#', '$', '%', '^'/*0x23*/,
-      '&', '*', '(', ')', 0, /*0x28*/
-      0, 0, 0, 0, 0, /*0x2d*/
-      '+', '{', '}', '|', '~', /*0x32*/
-      ':', '"', 0, '<', '>', /*0x37*/
-      '?'},
+    {
+        0, 0, 0, 0, 'A', 'B' /*0x05*/,
+        'C', 'D', 'E', 'F', 'G' /*0x0a*/,
+        'H', 'I', 'J', 'K', 'L'/*0x0f*/,
+        'M', 'N', 'O', 'P', 'Q'/*0x14*/,
+        'R', 'S', 'T', 'U', 'V'/*0x19*/,
+        'W', 'X', 'Y', 'Z', '!'/*0x1E*/,
+        '@', '#', '$', '%', '^'/*0x23*/,
+        '&', '*', '(', ')', 0, /*0x28*/
+        0, 0, 0, 0, 0, /*0x2d*/
+        '+', '{', '}', '|', '~', /*0x32*/
+        ':', '"', 0, '<', '>', /*0x37*/
+        '?'
+    },
 
     /* ALT MODIFIER */
-    { 0, 0, 0, 0, 0, 0 /*0x05*/,
-      0, 0, 0, 0, 0 /*0x0a*/,
-      0, 0, 0, 0, 0/*0x0f*/,
-      0, 0, 0, 0, 0/*0x14*/,
-      0, 0, 0, 0, 0/*0x19*/,
-      0, 0, 0, 0, 0/*0x1E*/,
-      0, 0, 0, 0, 0/*0x23*/,
-      0, 0, 0, 0, 0 /*enter*/, /*0x28*/
-      0, 0, 0, 0, 0, /*0x2d*/
-      0, 0, 0, 0, 0, /*0x32*/
-      0, 0, 0, 0, 0, /*0x37*/
-      0}
+    {
+        0, 0, 0, 0, 0, 0 /*0x05*/,
+        0, 0, 0, 0, 0 /*0x0a*/,
+        0, 0, 0, 0, 0/*0x0f*/,
+        0, 0, 0, 0, 0/*0x14*/,
+        0, 0, 0, 0, 0/*0x19*/,
+        0, 0, 0, 0, 0/*0x1E*/,
+        0, 0, 0, 0, 0/*0x23*/,
+        0, 0, 0, 0, 0 /*enter*/, /*0x28*/
+        0, 0, 0, 0, 0, /*0x2d*/
+        0, 0, 0, 0, 0, /*0x32*/
+        0, 0, 0, 0, 0, /*0x37*/
+        0
+    }
 
 };
 
 
-USBHostKeyboard::USBHostKeyboard() {
+USBHostKeyboard::USBHostKeyboard()
+{
     host = USBHost::getHostInst();
     init();
 }
 
 
-void USBHostKeyboard::init() {
+void USBHostKeyboard::init()
+{
     dev = NULL;
     int_in = NULL;
     report_id = 0;
@@ -94,12 +104,14 @@
     keyboard_device_found = false;
 }
 
-bool USBHostKeyboard::connected() {
+bool USBHostKeyboard::connected()
+{
     return dev_connected;
 }
 
 
-bool USBHostKeyboard::connect() {
+bool USBHostKeyboard::connect()
+{
 
     if (dev_connected) {
         return true;
@@ -108,20 +120,29 @@
     for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
         if ((dev = host->getDevice(i)) != NULL) {
 
-            if (host->enumerate(dev, this))
+            if (host->enumerate(dev, this)) {
                 break;
+            }
 
             if (keyboard_device_found) {
-                int_in = dev->getEndpoint(keyboard_intf, INTERRUPT_ENDPOINT, IN);
+                {
+                    /* As this is done in a specific thread
+                     * this lock is taken to avoid to process the device
+                     * disconnect in usb process during the device registering */
+                    USBHost::Lock  Lock(host);
 
-                if (!int_in)
-                    break;
+                    int_in = dev->getEndpoint(keyboard_intf, INTERRUPT_ENDPOINT, IN);
 
-                USB_INFO("New Keyboard device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, keyboard_intf);
-                dev->setName("Keyboard", keyboard_intf);
-                host->registerDriver(dev, keyboard_intf, this, &USBHostKeyboard::init);
+                    if (!int_in) {
+                        break;
+                    }
 
-                int_in->attach(this, &USBHostKeyboard::rxHandler);
+                    USB_INFO("New Keyboard device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, keyboard_intf);
+                    dev->setName("Keyboard", keyboard_intf);
+                    host->registerDriver(dev, keyboard_intf, this, &USBHostKeyboard::init);
+
+                    int_in->attach(this, &USBHostKeyboard::rxHandler);
+                }
                 host->interruptRead(dev, int_in, report, int_in->getSize(), false);
 
                 dev_connected = true;
@@ -133,7 +154,8 @@
     return false;
 }
 
-void USBHostKeyboard::rxHandler() {
+void USBHostKeyboard::rxHandler()
+{
     int len = int_in->getLengthTransferred();
     int index = (len == 9) ? 1 : 0;
     int len_listen = int_in->getSize();
@@ -149,8 +171,9 @@
             (*onKeyCode)(report[index + 2], modifier);
         }
     }
-    if (dev && int_in)
+    if (dev && int_in) {
         host->interruptRead(dev, int_in, report, len_listen, false);
+    }
 }
 
 /*virtual*/ void USBHostKeyboard::setVidPid(uint16_t vid, uint16_t pid)
@@ -161,9 +184,9 @@
 /*virtual*/ bool USBHostKeyboard::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
 {
     if ((keyboard_intf == -1) &&
-        (intf_class == HID_CLASS) &&
-        (intf_subclass == 0x01) &&
-        (intf_protocol == 0x01)) {
+            (intf_class == HID_CLASS) &&
+            (intf_subclass == 0x01) &&
+            (intf_protocol == 0x01)) {
         keyboard_intf = intf_nb;
         return true;
     }