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
Revision 36:f8c0979c2814, committed 2017-01-23
- 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
--- 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
