USBHost custom library.

Dependents:   GR-PEACH_HVC-P2_sample_client mbed-os-storage-access GR-PEACH_Digital_Signage GR-PEACH_Audio_Playback_Sample ... more

Fork of USBHost by mbed official

Files at this revision

API Documentation at this revision

Comitter:
dkato
Date:
Mon Jan 23 06:05:50 2017 +0000
Parent:
35:f72ccc6892ee
Child:
37:22e8f744bbad
Commit message:
Removed mbed-rtos so that it can be used with the mbed-os library.
; Partial modification of USBHostSerial.

Changed in this revision

FATFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
USBHostSerial/MtxCircBuffer.h Show annotated file Show diff for this revision Revisions of this file
USBHostSerial/USBHostSerial.cpp Show annotated file Show diff for this revision Revisions of this file
USBHostSerial/USBHostSerial.h Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show diff for this revision Revisions of this file
--- a/FATFileSystem.lib	Fri Apr 29 01:16:38 2016 +0100
+++ b/FATFileSystem.lib	Mon Jan 23 06:05:50 2017 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/FATFileSystem/#3ff2606d5713
+http://mbed.org/users/mbed_official/code/FATFileSystem/#e2ab678eb692
--- a/USBHostSerial/MtxCircBuffer.h	Fri Apr 29 01:16:38 2016 +0100
+++ b/USBHostSerial/MtxCircBuffer.h	Mon Jan 23 06:05:50 2017 +0000
@@ -18,7 +18,6 @@
 #define MTXCIRCBUFFER_H
 
 #include "stdint.h"
-#include "rtos.h"
 
 //Mutex protected circular buffer
 template<typename T, int size>
@@ -31,17 +30,11 @@
     }
 
     bool isFull() {
-        mtx.lock();
-        bool r = (((write + 1) % size) == read);
-        mtx.unlock();
-        return r;
+        return (((write + 1) % size) == read);
     }
 
     bool isEmpty() {
-        mtx.lock();
-        bool r = (read == write);
-        mtx.unlock();
-        return r;
+        return (read == write);
     }
 
     void flush() {
@@ -49,41 +42,34 @@
         read = 0;
     }
 
-    void queue(T k) {
-        mtx.lock();
-        while (((write + 1) % size) == read) {
-            mtx.unlock();
-            Thread::wait(10);
-            mtx.lock();
+    bool queue(T k) {
+        if (isFull()) {
+            return false;
         }
-        buf[write++] = k;
-        write %= size;
-        mtx.unlock();
+        buf[write] = k;
+        write = (write + 1) % size;
+        return true;
     }
 
-    uint16_t available() {
-        mtx.lock();
-        uint16_t a = (write >= read) ? (write - read) : (size - read + write);
-        mtx.unlock();
+    uint32_t available() {
+        uint32_t a = (write >= read) ? (write - read) : (size - read + write);
         return a;
     }
 
     bool dequeue(T * c) {
-        mtx.lock();
-        bool empty = (read == write);
-        if (!empty) {
-            *c = buf[read++];
-            read %= size;
+        if (isEmpty()) {
+            return false;
         }
-        mtx.unlock();
-        return (!empty);
+        *c = buf[read];
+        read = (read + 1) % size;
+        return true;
     }
 
 private:
-    volatile uint16_t write;
-    volatile uint16_t read;
+    volatile uint32_t write;
+    volatile uint32_t read;
     volatile T buf[size];
-    Mutex mtx;
 };
 
 #endif
+
--- a/USBHostSerial/USBHostSerial.cpp	Fri Apr 29 01:16:38 2016 +0100
+++ b/USBHostSerial/USBHostSerial.cpp	Mon Jan 23 06:05:50 2017 +0000
@@ -30,12 +30,6 @@
 {
     host = USBHost::getHostInst();
     ports_found = 0;
-    dev_connected = false;
-}
-
-bool USBHostSerial::connected()
-{
-    return dev_connected;
 }
 
 void USBHostSerial::disconnect(void)
@@ -46,18 +40,15 @@
 
 bool USBHostSerial::connect() {
 
-    if (dev)
-    {
-        for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
-        {
+    if (dev) {
+        for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
             USBDeviceConnected* d = host->getDevice(i);
             if (dev == d)
                 return true;
         }
         disconnect();
     }
-    for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
-    {
+    for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
         USBDeviceConnected* d = host->getDevice(i);
         if (d != NULL) {
 
@@ -71,7 +62,6 @@
             {
                 USBHostSerialPort::connect(host,d,port_intf,bulk_in, bulk_out);
                 dev = d;
-                dev_connected = true;
             }
         }
     }
@@ -113,7 +103,6 @@
     dev = NULL;
     memset(ports, NULL, sizeof(ports));
     ports_found = 0;
-    dev_connected = false;
 }
 
 USBHostMultiSerial::~USBHostMultiSerial()
@@ -121,11 +110,6 @@
     disconnect();
 }
 
-bool USBHostMultiSerial::connected()
-{
-    return dev_connected;
-}
-
 void USBHostMultiSerial::disconnect(void)
 {
     for (int port = 0; port < USBHOST_SERIAL; port ++)
@@ -172,7 +156,6 @@
                     {
                         ports[port]->connect(host,d,port_intf[port],bulk_in, bulk_out);
                         dev = d;
-                        dev_connected = true;
                     }
                 }
             }
@@ -218,9 +201,10 @@
 
 void USBHostSerialPort::init(void)
 {
+    dev_connected = false;
     host = NULL;
     dev = NULL;
-    serial_intf = NULL;
+    serial_intf = 0;
     size_bulk_in = 0;
     size_bulk_out = 0;
     bulk_in = NULL;
@@ -250,6 +234,11 @@
     bulk_in->attach(this, &USBHostSerialPort::rxHandler);
     bulk_out->attach(this, &USBHostSerialPort::txHandler);
     host->bulkRead(dev, bulk_in, buf, size_bulk_in, false);
+    dev_connected = true;
+}
+
+bool USBHostSerialPort::connected() {
+    return dev_connected;
 }
 
 void USBHostSerialPort::rxHandler() {
@@ -257,6 +246,9 @@
         int len = bulk_in->getLengthTransferred();
         if (bulk_in->getState() == USB_TYPE_IDLE) {
             for (int i = 0; i < len; i++) {
+                while (circ_buf.isFull()) {
+                    Thread::wait(1);
+                }
                 circ_buf.queue(buf[i]);
             }
             rx.call();
@@ -305,41 +297,59 @@
         init();
         return -1;
     }
-    while (circ_buf.isEmpty());
+    while (circ_buf.isEmpty()) {
+        if (dev_connected == false) {
+            return -1;
+        }
+        Thread::wait(1);
+    }
     circ_buf.dequeue(&c);
     return c;
 }
 
-int USBHostSerialPort::writeBuf(const char* b, int s)
-{
+int USBHostSerialPort::writeBuf(const char* b, int s) {
+    int i;
     int c = 0;
-    if (bulk_out)
-    {
-        while (c < s)
-        {
-            int i = (s < size_bulk_out) ? s : size_bulk_out;
-            if (host->bulkWrite(dev, bulk_out, (uint8_t *)(b+c), i) == USB_TYPE_OK)
+    if (bulk_out) {
+        while (c < s) {
+            if (dev_connected == false) {
+                break;
+            }
+            i = (s < size_bulk_out) ? s : size_bulk_out;
+            if (host->bulkWrite(dev, bulk_out, (uint8_t *)(b+c), i) == USB_TYPE_OK) {
                 c += i;
+            }
         }
     }
-    return s;
+    return c;
 }
 
-int USBHostSerialPort::readBuf(char* b, int s)
-{
+int USBHostSerialPort::readBuf(char* b, int s, int timeout) {
     int i = 0;
-    if (bulk_in)
-    {
-        for (i = 0; i < s; )
-            b[i++] = getc();
+
+    if (bulk_out) {
+        for (i = 0; i < s; i++) {
+            while ((circ_buf.isEmpty()) && (dev_connected)) {
+                if (timeout == 0) {
+                    break;
+                } else {
+                    if (timeout > 0) {
+                        timeout--;
+                    }
+                    Thread::wait(1);
+                }
+            }
+            if (!circ_buf.dequeue((uint8_t *)&b[i])) {
+                break;
+            }
+        }
     }
     return i;
 }
 
-uint8_t USBHostSerialPort::available() {
+uint32_t USBHostSerialPort::available() {
     return circ_buf.available();
 }
 
-
+#endif
 
-#endif
--- a/USBHostSerial/USBHostSerial.h	Fri Apr 29 01:16:38 2016 +0100
+++ b/USBHostSerial/USBHostSerial.h	Mon Jan 23 06:05:50 2017 +0000
@@ -51,12 +51,18 @@
     void connect(USBHost* _host, USBDeviceConnected * _dev,
         uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out);
 
+    bool connected();
+
     /**
     * Check the number of bytes available.
     *
     * @returns the number of bytes available
     */
+#if(1)
+    uint32_t available();
+#else
     uint8_t available();
+#endif
 
     /**
      *  Attach a member function to call when a packet is received.
@@ -105,7 +111,7 @@
      */
     void format(int bits = 8, Parity parity = USBHostSerialPort::None, int stop_bits = 1);
     virtual int writeBuf(const char* b, int s);
-    virtual int readBuf(char* b, int s);
+    virtual int readBuf(char* b, int s, int timeout = -1);
 
 protected:
     virtual int _getc();
@@ -122,7 +128,8 @@
 
     void init();
 
-    MtxCircBuffer<uint8_t, 128> circ_buf;
+//    MtxCircBuffer<uint8_t, 128> circ_buf;
+    MtxCircBuffer<uint8_t, (1024 * 32)> circ_buf;
 
     uint8_t buf[64];
 
@@ -141,6 +148,7 @@
     FunctionPointer tx;
 
     uint8_t serial_intf;
+    bool dev_connected;
 };
 
 #if (USBHOST_SERIAL <= 1)
@@ -164,7 +172,7 @@
     *
     * @returns true if a serial device is connected
     */
-    bool connected();
+//    bool connected();
 
 protected:
     USBHost* host;
@@ -177,8 +185,6 @@
     virtual bool 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
     virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
 
-private:
-    bool dev_connected;
 };
 
 #else // (USBHOST_SERIAL > 1)
@@ -221,8 +227,6 @@
     virtual bool 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
     virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
 
-private:
-    bool dev_connected;
 };
 #endif // (USBHOST_SERIAL <= 1)
 
--- a/mbed-rtos.lib	Fri Apr 29 01:16:38 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/mbed_official/code/mbed-rtos/#2db19f47c2ba