Simple USBHost library for Nucleo F446RE/F411RE/F401RE FRDM-KL46Z/KL25Z/F64F LPC4088/LPC1768

Dependencies:   FATFileSystem

Dependents:   F401RE-BTstack_example F401RE-USBHostMSD_HelloWorld

Fork of KL46Z-USBHost by Norimasa Okamoto

簡易USBホストライブラリです。
official-USBHostの下位互換で対応プログラムを僅かな修正で動かすことが出来ます。

Platforms

  • Nucleo F446RE
  • Nucleo F411RE
  • Nucleo F401RE
  • FRDM-K64F
  • FRDM-KL46Z
  • FRDM-KL25Z
  • LPC4088
  • LPC1768

Nucleo F446RE/F411RE/F401REのUSB接続方法

ST morphoUSB
U5V (CN10-8)VBUS (1 RED)
PA11 (CN10-14)DM  (2 WHITE)
PA12 (CN10-12)DP  (3 GREEN)
GND (CN10-20)GND (4 BLACK)

Examples

Import programF446RE-USBHostMouse_HelloWorld

USBHostMouse Hello World for ST-Nucleo-F446RE

Import programF401RE-USBHostMSD_HelloWorld

Simple USBHost MSD(USB flash drive) for Nucleo F401RE/FRDM-KL46Z test program

Import programF401RE-USBHostC270_example

Simple USBHost WebCam test program

Import programK64F_USBHostC270_example

Simple USBHost C270 example

Import programF401RE-BTstack_example

BTstack for Nucleo F401RE/FRDM-KL46Z example program

Import programUSBHostRSSI_example

Bluetooth device discovery example program.

Import programKL46Z-USBHostGPS_HelloWorld

Simple USBHost GPS Dongle Receiver for FRDM-KL46Z test program

Revision:
16:981c3104f6c0
Parent:
12:b91fdea8c0a7
Child:
18:61554f238584
--- a/USBHost/USBHost.cpp	Fri Jun 13 01:52:44 2014 +0000
+++ b/USBHost/USBHost.cpp	Mon Jun 23 20:30:04 2014 +0900
@@ -1,6 +1,4 @@
-// Simple USBHost for FRDM-KL46Z
 #include "USBHost.h"
-#include <algorithm>
 
 USBHost* USBHost::inst = NULL;
 
@@ -252,22 +250,12 @@
         USB_DBG("setup %02x", LastStatus);
         return -1;
     }
-    int read_len = 0;
-    while(read_len < size) {
-        int size2 = std::min(size-read_len, ep->getSize());
-        int result = token_in(ep, data+read_len, size2);
-        //USB_DBG("token_in result=%d %02x", result, LastStatus);
-        if (result < 0) {
-            USB_DBG("token_in %d/%d %02x", read_len, size, LastStatus);
-            return result;
-        }
-        read_len += result;
-        if (result < ep->getSize()) {
-            break;
-        }
-    }    
+    int read_len = multi_token_in(ep, data, size);
+    if (read_len < 0) {
+        return -1;
+    }
     ep->setData01(DATA1);
-    int result = token_out(ep); // status stage
+    int result = multi_token_out(ep); // status stage
     if (result < 0) {
         USB_DBG("status token_out %02x", LastStatus);
         if (LastStatus == STALL) {
@@ -292,13 +280,13 @@
     }
     int write_len = 0;
     if (data != NULL) {
-        write_len = token_out(ep, data, size);
+        write_len = multi_token_out(ep, data, size);
         if (write_len < 0) {
             return -1;
         }
     }
     ep->setData01(DATA1);
-    int result = token_in(ep); // status stage
+    int result = multi_token_in(ep); // status stage
     if (result < 0) {
         USB_DBG("result=%d %02x", result, LastStatus);
         //return result;
@@ -314,25 +302,10 @@
     USB_TEST_ASSERT(dev);
     setAddr(dev->getAddress(), dev->getSpeed());
     setEndpoint();
-    const int retryLimit = 0;
-    int read_len = 0;
-    for(int n = 0; read_len < size; n++) {
-        int size2 = std::min(size-read_len, ep->getSize());
-        int result = token_in(ep, data+read_len, size2, retryLimit);
-        if (result < 0) {
-            if (LastStatus == NAK) {
-                if (n == 0) {
-                    return -1;
-                }
-                break;
-            }
-            //USB_DBG("token_in result=%d %02x", result, LastStatus);
-            return result;
-        }
-        read_len += result;
-        if (result < ep->getSize()) {
-            break;
-        }
+    const bool block = false;
+    int read_len = multi_token_in(ep, data, size, block);
+    if (read_len < 0) {
+        return -1;
     }
     ep->setLengthTransferred(read_len);
     return read_len;
@@ -345,25 +318,10 @@
     USB_TEST_ASSERT(dev);
     setAddr(dev->getAddress(), dev->getSpeed());
     setEndpoint();
-    const int retryLimit = 0;
-    int transferred_len = 0;
-    for(int n = 0; transferred_len < size; n++) {
-        int size2 = std::min(size-transferred_len, ep->getSize());
-        int result = token_out(ep, data+transferred_len, size2, retryLimit);
-        if (result < 0) {
-            if (LastStatus == NAK) {
-                if (n == 0) {
-                    return -1;
-                }
-                break;
-            }
-            //USB_DBG("token_in result=%d %02x", result, LastStatus);
-            return result;
-        }
-        transferred_len += result;
-        if (result < ep->getSize()) {
-            break;
-        }
+    const bool block = true;
+    int transferred_len = multi_token_out(ep, data, size, block);
+    if (transferred_len < 0) {
+        return -1;
     }
     ep->setLengthTransferred(transferred_len);
     return transferred_len;
@@ -380,30 +338,10 @@
     USB_TEST_ASSERT(dev);
     setAddr(dev->getAddress());
     setEndpoint();
-    int retryLimit = (timeout_ms == 0) ? 0 : 10;
-    int read_len = 0;
-    Timer t;
-    for(int n = 0; read_len < size; n++) {
-        int size2 = std::min(size-read_len, ep->getSize());
-        int result = token_in(ep, data+read_len, size2, retryLimit);
-        if (result < 0) {
-            if (LastStatus == NAK) {
-                if (n == 0) {
-                    return -1;
-                }
-                break;
-            }
-            //USB_DBG("token_in result=%d %02x", result, LastStatus);
-            return result;
-        }
-        read_len += result;
-        if (result < ep->getSize()) {
-            break;
-        }
-        if (timeout_ms > 0 && t.read_ms() > timeout_ms) {
-            USB_DBG("timeout_ms: %d", timeout_ms);
-            break;
-        }
+    bool block = (timeout_ms != 0);
+    int read_len = multi_token_in(ep, data, size, block);
+    if (read_len < 0) {
+        return -1;
     }
     ep->setLengthTransferred(read_len);
     return read_len;
@@ -415,24 +353,9 @@
     USB_TEST_ASSERT(dev);
     setAddr(dev->getAddress());
     setEndpoint();
-    int write_len = 0;
-    for(int n = 0; write_len < size; n++) {
-        int size2 = std::min(size-write_len, ep->getSize());
-        int result = token_out(ep, data+write_len, size2);
-        if (result < 0) {
-            if (LastStatus == NAK) {
-                if (n == 0) {
-                    return -1;
-                }
-                break;
-            }
-            USB_DBG("token_out result=%d %02x", result, LastStatus);
-            return result;
-        }
-        write_len += result;
-        if (result < ep->getSize()) {
-            break;
-        }
+    int write_len = multi_token_out(ep, data, size);
+    if (write_len < 0) {
+        return -1;
     }
     ep->setLengthTransferred(write_len);
     return write_len;