Working version on STM32F411. Test for CLI
Dependencies: FATFileSystem mbed-rtos mbed
Fork of USBHost by
Revision 24:868cbfe611a7, committed 2014-06-03
- Comitter:
- mbed_official
- Date:
- Tue Jun 03 11:30:38 2014 +0100
- Parent:
- 23:759ec18ee1a7
- Child:
- 25:45dcbf2ba11d
- Commit message:
- Synchronized with git revision bcacbb9fbf3432829227430830cca4315b57c1b9
Full URL: https://github.com/mbedmicro/mbed/commit/bcacbb9fbf3432829227430830cca4315b57c1b9/
Changed in this revision
--- a/USBHost/USBDeviceConnected.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBDeviceConnected.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -50,10 +50,10 @@
INTERFACE * USBDeviceConnected::getInterface(uint8_t index) {
if (index >= MAX_INTF)
return NULL;
-
+
if (intf[index].in_use)
return &intf[index];
-
+
return NULL;
}
--- a/USBHost/USBDeviceConnected.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBDeviceConnected.h Tue Jun 03 11:30:38 2014 +0100
@@ -33,7 +33,7 @@
USBEndpoint * ep[MAX_ENDPOINT_PER_INTERFACE];
FunctionPointer detach;
char name[10];
-} INTERFACE;
+} INTERFACE;
/**
* USBDeviceConnected class
@@ -157,7 +157,7 @@
inline USBHostHub * getHubParent() { return hub_parent; };
inline uint8_t getNbIntf() { return nb_interf; };
inline const char * getName(uint8_t intf_nb) { return intf[intf_nb].name; };
-
+
// in case this device is a hub
USBHostHub * hub;
--- a/USBHost/USBEndpoint.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBEndpoint.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -29,7 +29,7 @@
memcpy((HCTD**)td_list, td_list_, sizeof(HCTD*)*2); //TODO: Maybe should add a param for td_list size... at least a define
memset(td_list_[0], 0, sizeof(HCTD));
memset(td_list_[1], 0, sizeof(HCTD));
-
+
td_list[0]->ep = this;
td_list[1]->ep = this;
@@ -52,7 +52,7 @@
td_current = td_list[0];
td_next = td_list[1];
-
+
intf_nb = 0;
state = USB_TYPE_IDLE;
--- a/USBHost/USBEndpoint.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBEndpoint.h Tue Jun 03 11:30:38 2014 +0100
@@ -136,9 +136,9 @@
inline bool isSetup() { return setup; }
inline USBEndpoint * nextEndpoint() { return (USBEndpoint*)nextEp; };
inline uint8_t getIntfNb() { return intf_nb; };
-
+
USBDeviceConnected * dev;
-
+
Queue<uint8_t, 1> ep_queue;
private:
@@ -163,7 +163,7 @@
volatile HCTD * td_list[2];
volatile HCTD * td_current;
volatile HCTD * td_next;
-
+
uint8_t intf_nb;
};
--- a/USBHost/USBHALHost.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBHALHost.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -57,7 +57,7 @@
void USBHALHost::init() {
NVIC_DisableIRQ(USB_IRQn);
-
+
//Cut power
LPC_SC->PCONP &= ~(1UL<<31);
wait_ms(100);
@@ -98,7 +98,7 @@
// software reset
LPC_USB->HcCommandStatus = OR_CMD_STATUS_HCR;
-
+
// Write Fm Interval and Largest Data Packet Counter
LPC_USB->HcFmInterval = DEFAULT_FMINTERVAL;
LPC_USB->HcPeriodicStart = FI * 90 / 100;
@@ -109,7 +109,7 @@
LPC_USB->HcRhStatus = OR_RH_STATUS_LPSC;
LPC_USB->HcHCCA = (uint32_t)(usb_hcca);
-
+
// Clear Interrrupt Status
LPC_USB->HcInterruptStatus |= LPC_USB->HcInterruptStatus;
@@ -249,9 +249,9 @@
void USBHALHost::resetRootHub() {
// Initiate port reset
LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS;
-
+
while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS);
-
+
// ...and clear port reset signal
LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC;
}
@@ -266,11 +266,11 @@
void USBHALHost::UsbIrqhandler() {
if( LPC_USB->HcInterruptStatus & LPC_USB->HcInterruptEnable ) //Is there something to actually process?
{
-
+
uint32_t int_status = LPC_USB->HcInterruptStatus & LPC_USB->HcInterruptEnable;
// Root hub status change interrupt
- if (int_status & OR_INTR_STATUS_RHSC) {
+ if (int_status & OR_INTR_STATUS_RHSC) {
if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CSC) {
if (LPC_USB->HcRhStatus & OR_RH_STATUS_DRWE) {
// When DRWE is on, Connect Status Change
@@ -278,27 +278,27 @@
} else {
//Root device connected
- if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) {
-
+ if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) {
+
// wait 150ms to avoid bounce
wait_ms(150);
-
+
//Hub 0 (root hub), Port 1 (count starts at 1), Low or High speed
- deviceConnected(0, 1, LPC_USB->HcRhPortStatus1 & OR_RH_PORT_LSDA);
- }
-
+ deviceConnected(0, 1, LPC_USB->HcRhPortStatus1 & OR_RH_PORT_LSDA);
+ }
+
//Root device disconnected
- else {
-
+ else {
+
if (!(int_status & OR_INTR_STATUS_WDH)) {
usb_hcca->DoneHead = 0;
}
-
+
// wait 200ms to avoid bounce
wait_ms(200);
-
+
deviceDisconnected(0, 1, NULL, usb_hcca->DoneHead & 0xFFFFFFFE);
-
+
if (int_status & OR_INTR_STATUS_WDH) {
usb_hcca->DoneHead = 0;
LPC_USB->HcInterruptStatus = OR_INTR_STATUS_WDH;
--- a/USBHost/USBHALHost.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBHALHost.h Tue Jun 03 11:30:38 2014 +0100
@@ -33,61 +33,61 @@
* init variables and memory where will be stored HCCA, ED and TD
*/
USBHALHost();
-
+
/**
- * Initialize host controller. Enable USB interrupts. This part is not in the constructor because,
+ * Initialize host controller. Enable USB interrupts. This part is not in the constructor because,
* this function calls a virtual method if a device is already connected
*/
void init();
-
+
/**
* reset the root hub
*/
void resetRootHub();
-
+
/**
* return the value contained in the control HEAD ED register
*
* @returns address of the control Head ED
*/
uint32_t controlHeadED();
-
+
/**
* return the value contained in the bulk HEAD ED register
*
* @returns address of the bulk head ED
*/
uint32_t bulkHeadED();
-
+
/**
* return the value of the head interrupt ED contained in the HCCA
*
* @returns address of the head interrupt ED contained in the HCCA
*/
uint32_t interruptHeadED();
-
+
/**
* Update the head ED for control transfers
*/
void updateControlHeadED(uint32_t addr);
-
+
/**
* Update the head ED for bulk transfers
*/
void updateBulkHeadED(uint32_t addr);
-
+
/**
* Update the head ED for interrupt transfers
*/
void updateInterruptHeadED(uint32_t addr);
-
+
/**
* Enable List for the specified endpoint type
*
* @param type enable the list of ENDPOINT_TYPE type
*/
void enableList(ENDPOINT_TYPE type);
-
+
/**
* Disable List for the specified endpoint type
*
@@ -104,7 +104,7 @@
* @param hub_parent reference to the hub where the device is connected (NULL if the hub parent is the root hub)
*/
virtual void deviceConnected(int hub, int port, bool lowSpeed, USBHostHub * hub_parent = NULL) = 0;
-
+
/**
* Virtual method called when a device has been disconnected
*
@@ -114,35 +114,35 @@
* @param addr list of the TDs which have been completed to dequeue freed TDs
*/
virtual void deviceDisconnected(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr) = 0;
-
+
/**
* Virtual method called when a transfer has been completed
*
* @param addr list of the TDs which have been completed
*/
virtual void transferCompleted(volatile uint32_t addr) = 0;
-
+
/**
* Find a memory section for a new ED
*
* @returns the address of the new ED
*/
volatile uint8_t * getED();
-
+
/**
* Find a memory section for a new TD
*
* @returns the address of the new TD
*/
volatile uint8_t * getTD();
-
+
/**
* Release a previous memory section reserved for an ED
*
* @param ed address of the ED
*/
void freeED(volatile uint8_t * ed);
-
+
/**
* Release a previous memory section reserved for an TD
*
@@ -161,7 +161,7 @@
uint8_t volatile * usb_tdBuf; //4 bytes aligned
static USBHALHost * instHost;
-
+
bool volatile edBufAlloc[MAX_ENDPOINT];
bool volatile tdBufAlloc[MAX_TD];
};
--- a/USBHost/USBHost.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBHost.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -47,7 +47,7 @@
* - call the callback attached to the endpoint where the td is attached
*/
void USBHost::usb_process() {
-
+
bool controlListState;
bool bulkListState;
bool interruptListState;
@@ -60,29 +60,29 @@
#if DEBUG_TRANSFER
uint8_t * buf_transfer;
#endif
-
+
#if MAX_HUB_NB
uint8_t k;
#endif
-
+
while(1) {
osEvent evt = mail_usb_event.get();
-
+
if (evt.status == osEventMail) {
-
+
message_t * usb_msg = (message_t*)evt.value.p;
-
+
switch (usb_msg->event_id) {
-
+
// a new device has been connected
case DEVICE_CONNECTED_EVENT:
too_many_hub = false;
buf[4] = 0;
-
+
do
{
Lock lock(this);
-
+
for (i = 0; i < MAX_DEVICE_CONNECTED; i++) {
if (!deviceInUse[i]) {
USB_DBG_EVENT("new device connected: %p\r\n", &devices[i]);
@@ -92,68 +92,68 @@
break;
}
}
-
+
if (i == MAX_DEVICE_CONNECTED) {
USB_ERR("Too many device connected!!\r\n");
continue;
}
-
+
if (!controlEndpointAllocated) {
control = newEndpoint(CONTROL_ENDPOINT, OUT, 0x08, 0x00);
addEndpoint(NULL, 0, (USBEndpoint*)control);
controlEndpointAllocated = true;
}
-
+
#if MAX_HUB_NB
if (usb_msg->hub_parent)
devices[i].setHubParent((USBHostHub *)(usb_msg->hub_parent));
#endif
-
+
for (j = 0; j < timeout_set_addr; j++) {
-
+
resetDevice(&devices[i]);
-
+
// set size of control endpoint
devices[i].setSizeControlEndpoint(8);
-
+
devices[i].activeAddress(false);
-
+
// get first 8 bit of device descriptor
// and check if we deal with a hub
USB_DBG("usb_thread read device descriptor on dev: %p\r\n", &devices[i]);
res = getDeviceDescriptor(&devices[i], buf, 8);
-
+
if (res != USB_TYPE_OK) {
USB_ERR("usb_thread could not read dev descr");
continue;
}
-
+
// set size of control endpoint
devices[i].setSizeControlEndpoint(buf[7]);
-
+
// second step: set an address to the device
res = setAddress(&devices[i], devices[i].getAddress());
-
+
if (res != USB_TYPE_OK) {
USB_ERR("SET ADDR FAILED");
continue;
}
devices[i].activeAddress(true);
USB_DBG("Address of %p: %d", &devices[i], devices[i].getAddress());
-
+
// try to read again the device descriptor to check if the device
// answers to its new address
res = getDeviceDescriptor(&devices[i], buf, 8);
-
+
if (res == USB_TYPE_OK) {
break;
}
-
+
Thread::wait(100);
}
-
+
USB_INFO("New device connected: %p [hub: %d - port: %d]", &devices[i], usb_msg->hub, usb_msg->port);
-
+
#if MAX_HUB_NB
if (buf[4] == HUB_CLASS) {
for (k = 0; k < MAX_HUB_NB; k++) {
@@ -169,49 +169,49 @@
break;
}
}
-
+
if (k == MAX_HUB_NB) {
USB_ERR("Too many hubs connected!!\r\n");
too_many_hub = true;
}
}
-
+
if (usb_msg->hub_parent)
((USBHostHub *)(usb_msg->hub_parent))->deviceConnected(&devices[i]);
#endif
-
+
if ((i < MAX_DEVICE_CONNECTED) && !too_many_hub) {
deviceInUse[i] = true;
}
-
+
} while(0);
-
+
break;
-
+
// a device has been disconnected
case DEVICE_DISCONNECTED_EVENT:
-
+
do
{
Lock lock(this);
-
+
controlListState = disableList(CONTROL_ENDPOINT);
bulkListState = disableList(BULK_ENDPOINT);
interruptListState = disableList(INTERRUPT_ENDPOINT);
-
+
idx = findDevice(usb_msg->hub, usb_msg->port, (USBHostHub *)(usb_msg->hub_parent));
if (idx != -1) {
freeDevice((USBDeviceConnected*)&devices[idx]);
}
-
+
if (controlListState) enableList(CONTROL_ENDPOINT);
if (bulkListState) enableList(BULK_ENDPOINT);
if (interruptListState) enableList(INTERRUPT_ENDPOINT);
-
+
} while(0);
-
+
break;
-
+
// a td has been processed
// call callback on the ed associated to the td
// we are not in ISR -> users can use printf in their callback method
@@ -241,7 +241,7 @@
}
break;
}
-
+
mail_usb_event.free(usb_msg);
}
}
@@ -272,7 +272,7 @@
for (uint8_t j = 0; j < MAX_INTF; j++)
deviceAttachedDriver[i][j] = false;
}
-
+
#if MAX_HUB_NB
for (uint8_t i = 0; i < MAX_HUB_NB; i++) {
hubs[i].setHost(this);
@@ -313,7 +313,7 @@
tdList = (volatile HCTD*)td->nextTD; //Dequeue element now as it could be modified below
if (td->ep != NULL) {
USBEndpoint * ep = (USBEndpoint *)(td->ep);
-
+
if (((HCTD *)td)->control >> 28) {
state = ((HCTD *)td)->control >> 28;
} else {
@@ -321,9 +321,9 @@
ep->setLengthTransferred((uint32_t)td->currBufPtr - (uint32_t)ep->getBufStart());
state = 16 /*USB_TYPE_IDLE*/;
}
-
+
ep->unqueueTransfer(td);
-
+
if (ep->getType() != CONTROL_ENDPOINT) {
// callback on the processed td will be called from the usb_thread (not in ISR)
message_t * usb_msg = mail_usb_event.alloc();
@@ -360,7 +360,7 @@
if (deviceInited[idx])
return;
}
-
+
message_t * usb_msg = mail_usb_event.alloc();
usb_msg->event_id = DEVICE_CONNECTED_EVENT;
usb_msg->hub = hub;
@@ -384,7 +384,7 @@
} else {
return;
}
-
+
message_t * usb_msg = mail_usb_event.alloc();
usb_msg->event_id = DEVICE_DISCONNECTED_EVENT;
usb_msg->hub = hub;
@@ -397,7 +397,7 @@
{
USBEndpoint * ep = NULL;
HCED * ed = NULL;
-
+
#if MAX_HUB_NB
if (dev->getClass() == HUB_CLASS) {
if (dev->hub == NULL) {
@@ -412,13 +412,13 @@
}
}
}
-
+
// notify hub parent that this device has been disconnected
if (dev->getHubParent())
dev->getHubParent()->deviceDisconnected(dev);
-
+
#endif
-
+
int idx = findDevice(dev);
if (idx != -1) {
deviceInUse[idx] = false;
@@ -481,7 +481,7 @@
updateInterruptHeadED(0);
headInterruptEndpoint = current->nextEndpoint();
}
-
+
// modify tail
switch (current->getType()) {
case BULK_ENDPOINT:
@@ -553,7 +553,7 @@
deviceReset[index] = true;
return USB_TYPE_OK;
}
-
+
return USB_TYPE_ERROR;
}
@@ -577,7 +577,7 @@
if ((dev != NULL) && dev->getSpeed()) {
ep->setSpeed(dev->getSpeed());
}
-
+
ep->setIntfNb(intf_nb);
// queue the new USBEndpoint on the ED list
@@ -626,7 +626,7 @@
default:
return false;
}
-
+
ep->dev = dev;
dev->addEndpoint(intf_nb, ep);
@@ -733,7 +733,7 @@
ed->queueTransfer();
printList(type);
enableList(type);
-
+
td_mutex.unlock();
return USB_TYPE_PROCESSING;
@@ -750,7 +750,7 @@
0, buf, MIN(DEVICE_DESCRIPTOR_LENGTH, max_len_buf));
if (len_dev_descr)
*len_dev_descr = MIN(DEVICE_DESCRIPTOR_LENGTH, max_len_buf);
-
+
return t;
}
@@ -772,10 +772,10 @@
}
total_conf_descr_length = buf[2] | (buf[3] << 8);
total_conf_descr_length = MIN(max_len_buf, total_conf_descr_length);
-
+
if (len_conf_descr)
*len_conf_descr = total_conf_descr_length;
-
+
USB_DBG("TOTAL_LENGTH: %d \t NUM_INTERF: %d", total_conf_descr_length, buf[4]);
return controlRead( dev,
@@ -792,7 +792,7 @@
SET_ADDRESS,
address,
0, NULL, 0);
-
+
}
USB_TYPE USBHost::setConfiguration(USBDeviceConnected * dev, uint8_t conf)
@@ -821,18 +821,18 @@
{
uint16_t total_conf_descr_length = 0;
USB_TYPE res;
-
+
do
{
Lock lock(this);
-
+
// don't enumerate a device which all interfaces are registered to a specific driver
int index = findDevice(dev);
-
+
if (index == -1) {
return USB_TYPE_ERROR;
}
-
+
uint8_t nb_intf_attached = numberDriverAttached(dev);
USB_DBG("dev: %p nb_intf: %d", dev, dev->getNbIntf());
USB_DBG("dev: %p nb_intf_attached: %d", dev, nb_intf_attached);
@@ -840,9 +840,9 @@
USB_DBG("Don't enumerate dev: %p because all intf are registered with a driver", dev);
return USB_TYPE_OK;
}
-
+
USB_DBG("Enumerate dev: %p", dev);
-
+
// third step: get the whole device descriptor to see vid, pid
res = getDeviceDescriptor(dev, data, DEVICE_DESCRIPTOR_LENGTH);
@@ -850,7 +850,7 @@
USB_DBG("GET DEV DESCR FAILED");
return res;
}
-
+
dev->setClass(data[4]);
dev->setSubClass(data[5]);
dev->setProtocol(data[6]);
@@ -877,7 +877,7 @@
// only set configuration if not enumerated before
if (!dev->isEnumerated()) {
-
+
USB_DBG("Set configuration 1 on dev: %p", dev);
// sixth step: set configuration (only 1 supported)
res = setConfiguration(dev, 1);
@@ -887,12 +887,12 @@
return res;
}
}
-
+
dev->setEnumerated();
// Now the device is enumerated!
USB_DBG("dev %p is enumerated\r\n", dev);
-
+
} while(0);
// Some devices may require this delay
@@ -991,17 +991,17 @@
}
USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking, ENDPOINT_TYPE type, bool write) {
-
+
#if DEBUG_TRANSFER
const char * type_str = (type == BULK_ENDPOINT) ? "BULK" : ((type == INTERRUPT_ENDPOINT) ? "INTERRUPT" : "ISOCHRONOUS");
USB_DBG_TRANSFER("----- %s %s [dev: %p - %s - hub: %d - port: %d - addr: %d - ep: %02X]------", type_str, (write) ? "WRITE" : "READ", dev, dev->getName(ep->getIntfNb()), dev->getHub(), dev->getPort(), dev->getAddress(), ep->getAddress());
#endif
-
+
Lock lock(this);
-
+
USB_TYPE res;
ENDPOINT_DIRECTION dir = (write) ? OUT : IN;
-
+
if (dev == NULL) {
USB_ERR("dev NULL");
return USB_TYPE_ERROR;
@@ -1026,7 +1026,7 @@
USB_ERR("[ep: %p - dev: %p] USBEndpoint addr and device addr don't match", ep, ep->dev);
return USB_TYPE_ERROR;
}
-
+
#if DEBUG_TRANSFER
if (write) {
USB_DBG_TRANSFER("%s WRITE buffer", type_str);
@@ -1038,19 +1038,19 @@
addTransfer(ep, buf, len);
if (blocking) {
-
+
ep->ep_queue.get();
res = ep->getState();
-
+
USB_DBG_TRANSFER("%s TRANSFER res: %s on ep: %p\r\n", type_str, ep->getStateString(), ep);
-
+
if (res != USB_TYPE_IDLE) {
return res;
}
-
+
return USB_TYPE_OK;
}
-
+
return USB_TYPE_PROCESSING;
}
--- a/USBHost/USBHost.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBHost.h Tue Jun 03 11:30:38 2014 +0100
@@ -35,7 +35,7 @@
* Static method to create or retrieve the single USBHost instance
*/
static USBHost * getHostInst();
-
+
/**
* Control read: setup stage, data stage and status stage
*
@@ -186,19 +186,19 @@
dev->onDisconnect(intf, fn);
}
}
-
+
/**
* Instantiate to protect USB thread from accessing shared objects (USBConnectedDevices and Interfaces)
*/
class Lock
{
public:
- Lock(USBHost* pHost);
- ~Lock();
+ Lock(USBHost* pHost);
+ ~Lock();
private:
USBHost* m_pHost;
};
-
+
friend class USBHostHub;
protected:
@@ -257,7 +257,7 @@
bool deviceAttachedDriver[MAX_DEVICE_CONNECTED][MAX_INTF];
bool deviceReset[MAX_DEVICE_CONNECTED];
bool deviceInited[MAX_DEVICE_CONNECTED];
-
+
#if MAX_HUB_NB
USBHostHub hubs[MAX_HUB_NB];
bool hub_in_use[MAX_HUB_NB];
@@ -265,7 +265,7 @@
// to store a setup packet
uint8_t setupPacket[8];
-
+
typedef struct {
uint8_t event_id;
void * td_addr;
@@ -275,17 +275,17 @@
uint8_t td_state;
void * hub_parent;
} message_t;
-
+
Thread usbThread;
void usb_process();
static void usb_process_static(void const * arg);
Mail<message_t, 10> mail_usb_event;
Mutex usb_mutex;
Mutex td_mutex;
-
+
// buffer for conf descriptor
uint8_t data[415];
-
+
/**
* Add a transfer on the TD linked list associated to an ED
*
@@ -296,7 +296,7 @@
* @return status of the transfer
*/
USB_TYPE addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) ;
-
+
/**
* Link the USBEndpoint to the linked list and attach an USBEndpoint this USBEndpoint to a device
*
@@ -318,7 +318,7 @@
* @returns pointer on the USBEndpoint created
*/
USBEndpoint * newEndpoint(ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint32_t size, uint8_t addr) ;
-
+
/**
* Request the device descriptor
*
@@ -338,7 +338,7 @@
* @param len_conf_descr pointer to store the length of the packet transferred
*/
USB_TYPE getConfigurationDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_conf_descr = NULL);
-
+
/**
* Set the address of a specific device
*
@@ -354,7 +354,7 @@
* @param conf configuration number to activate (usually 1)
*/
USB_TYPE setConfiguration(USBDeviceConnected * dev, uint8_t conf);
-
+
/**
* Free a specific device
*
@@ -378,7 +378,7 @@
bool blocking,
ENDPOINT_TYPE type,
bool write) ;
-
+
void fillControlBuf(uint8_t requestType, uint8_t request, uint16_t value, uint16_t index, int len) ;
void parseConfDescr(USBDeviceConnected * dev, uint8_t * conf_descr, uint32_t len, IUSBEnumerator* pEnumerator) ;
int findDevice(USBDeviceConnected * dev) ;
--- a/USBHost/USBHostConf.h Fri Mar 07 16:00:46 2014 +0000 +++ b/USBHost/USBHostConf.h Tue Jun 03 11:30:38 2014 +0100 @@ -56,7 +56,7 @@ /* * Enable USB3Gmodule */ -#define USBHOST_3GMODULE 1 +#define USBHOST_3GMODULE 1 /* * Maximum number of interfaces of a usb device
--- a/USBHost/USBHostTypes.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost/USBHostTypes.h Tue Jun 03 11:30:38 2014 +0100
@@ -67,28 +67,28 @@
#define HUB_CLASS 0x09
#define SERIAL_CLASS 0x0A
-// ------------------ HcControl Register ---------------------
+// ------------------ HcControl Register ---------------------
#define OR_CONTROL_PLE 0x00000004
#define OR_CONTROL_CLE 0x00000010
#define OR_CONTROL_BLE 0x00000020
#define OR_CONTROL_HCFS 0x000000C0
#define OR_CONTROL_HC_OPER 0x00000080
-// ----------------- HcCommandStatus Register -----------------
+// ----------------- HcCommandStatus Register -----------------
#define OR_CMD_STATUS_HCR 0x00000001
#define OR_CMD_STATUS_CLF 0x00000002
#define OR_CMD_STATUS_BLF 0x00000004
-// --------------- HcInterruptStatus Register -----------------
+// --------------- HcInterruptStatus Register -----------------
#define OR_INTR_STATUS_WDH 0x00000002
#define OR_INTR_STATUS_RHSC 0x00000040
#define OR_INTR_STATUS_UE 0x00000010
-// --------------- HcInterruptEnable Register -----------------
+// --------------- HcInterruptEnable Register -----------------
#define OR_INTR_ENABLE_WDH 0x00000002
#define OR_INTR_ENABLE_RHSC 0x00000040
#define OR_INTR_ENABLE_MIE 0x80000000
-// ---------------- HcRhDescriptorA Register ------------------
+// ---------------- HcRhDescriptorA Register ------------------
#define OR_RH_STATUS_LPSC 0x00010000
#define OR_RH_STATUS_DRWE 0x00008000
-// -------------- HcRhPortStatus[1:NDP] Register --------------
+// -------------- HcRhPortStatus[1:NDP] Register --------------
#define OR_RH_PORT_CCS 0x00000001
#define OR_RH_PORT_PRS 0x00000010
#define OR_RH_PORT_CSC 0x00010000
@@ -100,14 +100,14 @@
#define ED_SKIP (uint32_t) (0x00001000) // Skip this ep in queue
-#define TD_ROUNDING (uint32_t) (0x00040000) // Buffer Rounding
-#define TD_SETUP (uint32_t)(0) // Direction of Setup Packet
-#define TD_IN (uint32_t)(0x00100000) // Direction In
-#define TD_OUT (uint32_t)(0x00080000) // Direction Out
-#define TD_DELAY_INT(x) (uint32_t)((x) << 21) // Delay Interrupt
-#define TD_TOGGLE_0 (uint32_t)(0x02000000) // Toggle 0
-#define TD_TOGGLE_1 (uint32_t)(0x03000000) // Toggle 1
-#define TD_CC (uint32_t)(0xF0000000) // Completion Code
+#define TD_ROUNDING (uint32_t) (0x00040000) // Buffer Rounding
+#define TD_SETUP (uint32_t)(0) // Direction of Setup Packet
+#define TD_IN (uint32_t)(0x00100000) // Direction In
+#define TD_OUT (uint32_t)(0x00080000) // Direction Out
+#define TD_DELAY_INT(x) (uint32_t)((x) << 21) // Delay Interrupt
+#define TD_TOGGLE_0 (uint32_t)(0x02000000) // Toggle 0
+#define TD_TOGGLE_1 (uint32_t)(0x03000000) // Toggle 1
+#define TD_CC (uint32_t)(0xF0000000) // Completion Code
#define DEVICE_DESCRIPTOR (1)
#define CONFIGURATION_DESCRIPTOR (2)
@@ -115,7 +115,7 @@
#define ENDPOINT_DESCRIPTOR (5)
#define HID_DESCRIPTOR (33)
-// ----------- Control RequestType Fields -----------
+// ----------- Control RequestType Fields -----------
#define USB_DEVICE_TO_HOST 0x80
#define USB_HOST_TO_DEVICE 0x00
#define USB_REQUEST_TYPE_CLASS 0x20
@@ -124,14 +124,14 @@
#define USB_RECIPIENT_INTERFACE 0x01
#define USB_RECIPIENT_ENDPOINT 0x02
-// -------------- USB Standard Requests --------------
+// -------------- USB Standard Requests --------------
#define SET_ADDRESS 0x05
#define GET_DESCRIPTOR 0x06
#define SET_CONFIGURATION 0x09
#define SET_INTERFACE 0x0b
#define CLEAR_FEATURE 0x01
-// -------------- USB Descriptor Length --------------
+// -------------- USB Descriptor Length --------------
#define DEVICE_DESCRIPTOR_LENGTH 0x12
#define CONFIGURATION_DESCRIPTOR_LENGTH 0x09
@@ -145,7 +145,7 @@
uint32_t dummy[3]; // padding
} PACKED HCTD;
-// ----------- HostController EndPoint Descriptor -------------
+// ----------- HostController EndPoint Descriptor -------------
typedef struct hcEd {
__IO uint32_t control; // Endpoint descriptor control
__IO HCTD * tailTD; // Physical address of tail in Transfer descriptor list
@@ -154,73 +154,73 @@
} PACKED HCED;
-// ----------- Host Controller Communication Area ------------
+// ----------- Host Controller Communication Area ------------
typedef struct hcca {
__IO uint32_t IntTable[32]; // Interrupt Table
__IO uint32_t FrameNumber; // Frame Number
__IO uint32_t DoneHead; // Done Head
- volatile uint8_t Reserved[116]; // Reserved for future use
- volatile uint8_t Unknown[4]; // Unused
+ volatile uint8_t Reserved[116]; // Reserved for future use
+ volatile uint8_t Unknown[4]; // Unused
} PACKED HCCA;
typedef struct {
- uint8_t bLength;
- uint8_t bDescriptorType;
- uint16_t bcdUSB;
- uint8_t bDeviceClass;
- uint8_t bDeviceSubClass;
- uint8_t bDeviceProtocol;
- uint8_t bMaxPacketSize;
- uint16_t idVendor;
- uint16_t idProduct;
- uint16_t bcdDevice;
- uint8_t iManufacturer;
- uint8_t iProduct;
- uint8_t iSerialNumber;
- uint8_t bNumConfigurations;
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint16_t bcdUSB;
+ uint8_t bDeviceClass;
+ uint8_t bDeviceSubClass;
+ uint8_t bDeviceProtocol;
+ uint8_t bMaxPacketSize;
+ uint16_t idVendor;
+ uint16_t idProduct;
+ uint16_t bcdDevice;
+ uint8_t iManufacturer;
+ uint8_t iProduct;
+ uint8_t iSerialNumber;
+ uint8_t bNumConfigurations;
} PACKED DeviceDescriptor;
typedef struct {
- uint8_t bLength;
- uint8_t bDescriptorType;
- uint16_t wTotalLength;
- uint8_t bNumInterfaces;
- uint8_t bConfigurationValue;
- uint8_t iConfiguration;
- uint8_t bmAttributes;
- uint8_t bMaxPower;
-} PACKED ConfigurationDescriptor;
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint16_t wTotalLength;
+ uint8_t bNumInterfaces;
+ uint8_t bConfigurationValue;
+ uint8_t iConfiguration;
+ uint8_t bmAttributes;
+ uint8_t bMaxPower;
+} PACKED ConfigurationDescriptor;
typedef struct {
- uint8_t bLength;
- uint8_t bDescriptorType;
- uint8_t bInterfaceNumber;
- uint8_t bAlternateSetting;
- uint8_t bNumEndpoints;
- uint8_t bInterfaceClass;
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bInterfaceNumber;
+ uint8_t bAlternateSetting;
+ uint8_t bNumEndpoints;
+ uint8_t bInterfaceClass;
uint8_t bInterfaceSubClass;
uint8_t bInterfaceProtocol;
- uint8_t iInterface;
-} InterfaceDescriptor;
+ uint8_t iInterface;
+} InterfaceDescriptor;
typedef struct {
- uint8_t bLength;
- uint8_t bDescriptorType;
- uint8_t bEndpointAddress;
- uint8_t bmAttributes;
- uint16_t wMaxPacketSize;
- uint8_t bInterval;
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bEndpointAddress;
+ uint8_t bmAttributes;
+ uint16_t wMaxPacketSize;
+ uint8_t bInterval;
} EndpointDescriptor;
typedef struct {
- uint8_t bDescLength;
- uint8_t bDescriptorType;
- uint8_t bNbrPorts;
+ uint8_t bDescLength;
+ uint8_t bDescriptorType;
+ uint8_t bNbrPorts;
uint16_t wHubCharacteristics;
- uint8_t bPwrOn2PwrGood;
- uint8_t bHubContrCurrent;
- uint8_t DeviceRemovable;
- uint8_t PortPweCtrlMak;
-} HubDescriptor;
+ uint8_t bPwrOn2PwrGood;
+ uint8_t bHubContrCurrent;
+ uint8_t DeviceRemovable;
+ uint8_t PortPweCtrlMak;
+} HubDescriptor;
#endif
--- a/USBHost3GModule/WANDongle.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost3GModule/WANDongle.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -45,12 +45,12 @@
USB_DBG("Trying to connect device");
if (dev_connected) {
- USB_DBG("Device is already connected!");
+ USB_DBG("Device is already connected!");
return true;
}
-
+
m_pInitializer = NULL;
-
+
//Protect from concurrent access from USB thread
USBHost::Lock lock(host);
@@ -59,16 +59,16 @@
if ((dev = host->getDevice(i)) != NULL)
{
m_pInitializer = NULL; //Will be set in setVidPid callback
-
+
USB_DBG("Enumerate");
int ret = host->enumerate(dev, this);
if(ret)
{
return false;
}
-
+
USB_DBG("Device has VID:%04x PID:%04x", dev->getVid(), dev->getPid());
-
+
if(m_pInitializer) //If an initializer has been found
{
USB_DBG("m_pInitializer=%p", m_pInitializer);
@@ -90,18 +90,18 @@
USB_DBG("Ep %p", m_pInitializer->getEp(dev, j, true));
m_serial[j].connect( dev, m_pInitializer->getEp(dev, j, false), m_pInitializer->getEp(dev, j, true) );
}
-
+
USB_DBG("Device connected");
-
+
dev_connected = true;
-
-
+
+
return true;
}
else if ((dev->getVid() == m_pInitializer->getMSDVid()) && (dev->getPid() == m_pInitializer->getMSDPid()))
{
USB_DBG("Vodafone K3370 dongle detected in MSD mode");
- //Try to switch
+ //Try to switch
if( m_pInitializer->switchMode(dev) )
{
USB_DBG("Switched OK");
--- a/USBHost3GModule/WANDongle.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost3GModule/WANDongle.h Tue Jun 03 11:30:38 2014 +0100
@@ -58,47 +58,47 @@
* @return true if a serial device is connected
*/
bool connected();
-
+
/*
* Try to connect device
*
* * @return true if connection was successful
*/
bool tryConnect();
-
+
/*
* Disconnect device
*
* * @return true if disconnection was successful
*/
bool disconnect();
-
+
int getDongleType();
-
+
IUSBHostSerial& getSerial(int index);
int getSerialCount();
bool addInitializer(WANDongleInitializer* pInitializer);
//From IUSBEnumerator
-
+
virtual void setVidPid(uint16_t vid, uint16_t pid);
-
+
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
-
+
protected:
USBHost * host;
USBDeviceConnected * dev;
bool dev_connected;
-
+
WANDongleInitializer* m_pInitializer;
void init();
-
+
WANDongleSerialPort m_serial[WANDONGLE_MAX_SERIAL_PORTS];
int m_serialCount;
-
+
int m_totalInitializers;
WANDongleInitializer* m_Initializers[WANDONGLE_MAX_INITIALIZERS];
};
--- a/USBHost3GModule/WANDongleInitializer.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost3GModule/WANDongleInitializer.h Tue Jun 03 11:30:38 2014 +0100
@@ -40,29 +40,29 @@
WANDongleInitializer(USBHost* pHost) { m_pHost = pHost; }
USBHost* m_pHost;
uint8_t m_serialIntfMap[WANDONGLE_MAX_SERIAL_PORTS];
-
+
public:
virtual ~WANDongleInitializer() {}
virtual uint16_t getMSDVid() = 0;
virtual uint16_t getMSDPid() = 0;
-
+
virtual uint16_t getSerialVid() = 0;
virtual uint16_t getSerialPid() = 0;
-
+
virtual bool switchMode(USBDeviceConnected* pDev) = 0;
-
+
virtual USBEndpoint* getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx) {
return pDev->getEndpoint(m_serialIntfMap[serialPortNumber], BULK_ENDPOINT, tx ? OUT : IN, 0);
}
-
+
virtual int getSerialPortCount() = 0;
-
+
virtual void setVidPid(uint16_t vid, uint16_t pid) = 0;
-
+
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) = 0; //Must return true if the interface should be parsed
-
+
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) = 0; //Must return true if the endpoint will be used
-
+
virtual int getType() = 0;
virtual uint8_t getSerialIntf(int index) { return m_serialIntfMap[index]; }
--- a/USBHost3GModule/WANDongleSerialPort.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost3GModule/WANDongleSerialPort.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -58,7 +58,7 @@
buf_in_read_pos = 0;
lock_rx = false;
cb_rx_pending = false;
-
+
tx_mtx.unlock();
rx_mtx.unlock();
}
@@ -73,7 +73,7 @@
rx_mtx.unlock();
return -1;
}
-
+
if( bulk_in == NULL )
{
USB_WARN("Port is disconnected");
@@ -105,7 +105,7 @@
tx_mtx.unlock();
return -1;
}
-
+
if( bulk_out == NULL )
{
USB_WARN("Port is disconnected");
--- a/USBHost3GModule/WANDongleSerialPort.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHost3GModule/WANDongleSerialPort.h Tue Jun 03 11:30:38 2014 +0100
@@ -42,11 +42,11 @@
*
*/
WANDongleSerialPort();
-
+
void init( USBHost* pHost );
-
+
void connect( USBDeviceConnected* pDev, USBEndpoint* pInEp, USBEndpoint* pOutEp );
-
+
void disconnect( );
/*
@@ -89,13 +89,13 @@
* @param pListener instance of the listener deriving from the IUSBHostSerialListener
*/
virtual void attach(IUSBHostSerialListener* pListener);
-
+
/**
* Enable or disable readable/writeable callbacks
*/
virtual void setupIrq(bool en, IrqType irq = RxIrq);
-
+
protected:
USBEndpoint * bulk_in;
USBEndpoint * bulk_out;
@@ -117,11 +117,11 @@
volatile bool cb_rx_en;
volatile bool cb_rx_pending;
Mutex rx_mtx;
-
+
IUSBHostSerialListener* listener;
-
+
void reset();
-
+
void rxHandler();
void txHandler();
--- a/USBHostHID/USBHostKeyboard.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostHID/USBHostKeyboard.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -18,7 +18,7 @@
#if USBHOST_KEYBOARD
-static uint8_t keymap[4][0x39] = {
+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*/,
@@ -100,30 +100,30 @@
bool USBHostKeyboard::connect() {
-
+
if (dev_connected) {
return true;
}
-
+
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
if ((dev = host->getDevice(i)) != NULL) {
if (host->enumerate(dev, this))
break;
-
+
if (keyboard_device_found) {
int_in = dev->getEndpoint(keyboard_intf, INTERRUPT_ENDPOINT, IN);
-
+
if (!int_in)
break;
-
+
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;
return true;
}
--- a/USBHostHID/USBHostKeyboard.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostHID/USBHostKeyboard.h Tue Jun 03 11:30:38 2014 +0100
@@ -23,12 +23,12 @@
#include "USBHost.h"
-/**
+/**
* A class to communicate a USB keyboard
*/
class USBHostKeyboard : public IUSBEnumerator {
public:
-
+
/**
* Constructor
*/
@@ -83,7 +83,7 @@
uint8_t report[9];
int keyboard_intf;
bool keyboard_device_found;
-
+
bool dev_connected;
void rxHandler();
@@ -92,7 +92,7 @@
void (*onKeyCode)(uint8_t key, uint8_t modifier);
int report_id;
-
+
void init();
};
--- a/USBHostHID/USBHostMouse.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostHID/USBHostMouse.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -35,7 +35,7 @@
dev_connected = false;
mouse_device_found = false;
mouse_intf = -1;
-
+
buttons = 0;
x = 0;
y = 0;
@@ -51,26 +51,26 @@
if (dev_connected) {
return true;
}
-
+
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
if ((dev = host->getDevice(i)) != NULL) {
if(host->enumerate(dev, this))
break;
-
+
if (mouse_device_found) {
-
+
int_in = dev->getEndpoint(mouse_intf, INTERRUPT_ENDPOINT, IN);
if (!int_in)
break;
-
+
USB_INFO("New Mouse device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, mouse_intf);
dev->setName("Mouse", mouse_intf);
host->registerDriver(dev, mouse_intf, this, &USBHostMouse::init);
-
+
int_in->attach(this, &USBHostMouse::rxHandler);
host->interruptRead(dev, int_in, report, int_in->getSize(), false);
-
+
dev_connected = true;
return true;
}
@@ -82,33 +82,33 @@
void USBHostMouse::rxHandler() {
int len_listen = int_in->getSize();
-
+
if (onUpdate) {
(*onUpdate)(report[0] & 0x07, report[1], report[2], report[3]);
}
-
+
if (onButtonUpdate && (buttons != (report[0] & 0x07))) {
(*onButtonUpdate)(report[0] & 0x07);
}
-
+
if (onXUpdate && (x != report[1])) {
(*onXUpdate)(report[1]);
}
-
+
if (onYUpdate && (y != report[2])) {
(*onYUpdate)(report[2]);
}
-
+
if (onZUpdate && (z != report[3])) {
(*onZUpdate)(report[3]);
}
-
+
// update mouse state
buttons = report[0] & 0x07;
x = report[1];
y = report[2];
z = report[3];
-
+
if (dev)
host->interruptRead(dev, int_in, report, len_listen, false);
}
--- a/USBHostHID/USBHostMouse.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostHID/USBHostMouse.h Tue Jun 03 11:30:38 2014 +0100
@@ -23,7 +23,7 @@
#include "USBHost.h"
-/**
+/**
* A class to communicate a USB mouse
*/
class USBHostMouse : public IUSBEnumerator {
@@ -58,7 +58,7 @@
onUpdate = ptr;
}
}
-
+
/**
* Attach a callback called when the button state changes
*
@@ -69,7 +69,7 @@
onButtonUpdate = ptr;
}
}
-
+
/**
* Attach a callback called when the X axis value changes
*
@@ -80,7 +80,7 @@
onXUpdate = ptr;
}
}
-
+
/**
* Attach a callback called when the Y axis value changes
*
@@ -91,7 +91,7 @@
onYUpdate = ptr;
}
}
-
+
/**
* Attach a callback called when the Z axis value changes (scrolling)
*
@@ -114,7 +114,7 @@
USBDeviceConnected * dev;
USBEndpoint * int_in;
uint8_t report[4];
-
+
bool dev_connected;
bool mouse_device_found;
int mouse_intf;
--- a/USBHostHub/USBHostHub.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostHub/USBHostHub.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -64,7 +64,7 @@
hub_device_found = false;
nb_port = 0;
hub_characteristics = 0;
-
+
for (int i = 0; i < MAX_HUB_PORT; i++) {
device_children[i] = NULL;
}
@@ -80,52 +80,52 @@
}
bool USBHostHub::connect(USBDeviceConnected * dev)
-{
+{
if (dev_connected) {
return true;
}
-
+
if(host->enumerate(dev, this)) {
init();
return false;
}
-
+
if (hub_device_found) {
this->dev = dev;
-
+
int_in = dev->getEndpoint(hub_intf, INTERRUPT_ENDPOINT, IN);
-
+
if (!int_in) {
init();
return false;
}
-
+
USB_INFO("New HUB: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, hub_intf);
dev->setName("Hub", hub_intf);
host->registerDriver(dev, hub_intf, this, &USBHostHub::disconnect);
-
+
int_in->attach(this, &USBHostHub::rxHandler);
-
+
// get HUB descriptor
- host->controlRead( dev,
+ host->controlRead( dev,
USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS,
GET_DESCRIPTOR,
0x29 << 8, 0, buf, sizeof(HubDescriptor));
nb_port = buf[2];
hub_characteristics = buf[3];
-
+
USB_DBG("Hub has %d port", nb_port);
-
+
for (uint8_t j = 1; j <= nb_port; j++) {
setPortFeature(PORT_POWER_FEATURE, j);
}
wait_ms(buf[5]*2);
-
+
host->interruptRead(dev, int_in, buf, 1, false);
dev_connected = true;
return true;
}
-
+
return false;
}
@@ -184,7 +184,7 @@
for (int port = 1; port <= nb_port; port++) {
status = getPortStatus(port);
USB_DBG("[hub handler hub: %d] status port %d [hub: %p]: 0x%X", dev->getHub(), port, dev, status);
-
+
// if connection status has changed
if (status & C_PORT_CONNECTION) {
if (status & PORT_CONNECTION) {
@@ -194,18 +194,18 @@
USB_DBG("[hub handler hub: %d - port: %d] device disconnected", dev->getHub(), port);
host->deviceDisconnected(dev->getHub() + 1, port, this, 0);
}
-
+
clearPortFeature(C_PORT_CONNECTION_FEATURE, port);
}
-
+
if (status & C_PORT_RESET) {
clearPortFeature(C_PORT_RESET_FEATURE, port);
}
-
+
if (status & C_PORT_ENABLE) {
clearPortFeature(C_PORT_ENABLE_FEATURE, port);
}
-
+
if ((status & PORT_OVER_CURRENT)) {
USB_ERR("OVER CURRENT DETECTED\r\n");
clearPortFeature(PORT_OVER_CURRENT, port);
--- a/USBHostHub/USBHostHub.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostHub/USBHostHub.h Tue Jun 03 11:30:38 2014 +0100
@@ -28,7 +28,7 @@
class USBDeviceConnected;
class USBEndpoint;
-/**
+/**
* A class to use a USB Hub
*/
class USBHostHub : public IUSBEnumerator {
@@ -52,7 +52,7 @@
* @return true if connection was successful
*/
bool connect(USBDeviceConnected * dev);
-
+
/**
* Automatically called by USBHost when a device
* has been enumerated by usb_thread
@@ -60,7 +60,7 @@
* @param dev device connected
*/
void deviceConnected(USBDeviceConnected * dev);
-
+
/**
* Automatically called by USBHost when a device
* has been disconnected from this hub
@@ -68,21 +68,21 @@
* @param dev device disconnected
*/
void deviceDisconnected(USBDeviceConnected * dev);
-
+
/**
* Rest a specific port
*
* @param port port number
*/
void portReset(uint8_t port);
-
+
/*
* Called by USBHost to set the instance of USBHost
*
* @param host host instance
*/
void setHost(USBHost * host);
-
+
/**
* Called by USBhost when a hub has been disconnected
*/
@@ -114,7 +114,7 @@
uint32_t getPortStatus(uint8_t port);
USBDeviceConnected * device_children[MAX_HUB_PORT];
-
+
void init();
void disconnect();
--- a/USBHostMSD/USBHostMSD.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostMSD/USBHostMSD.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -65,19 +65,19 @@
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
if ((dev = host->getDevice(i)) != NULL) {
-
+
USB_DBG("Trying to connect MSD device\r\n");
-
+
if(host->enumerate(dev, this))
break;
if (msd_device_found) {
bulk_in = dev->getEndpoint(msd_intf, BULK_ENDPOINT, IN);
bulk_out = dev->getEndpoint(msd_intf, BULK_ENDPOINT, OUT);
-
+
if (!bulk_in || !bulk_out)
continue;
-
+
USB_INFO("New MSD device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, msd_intf);
dev->setName("MSD", msd_intf);
host->registerDriver(dev, msd_intf, this, &USBHostMSD::init);
@@ -219,7 +219,7 @@
if (data) {
USB_DBG("data stage");
if (flags == HOST_TO_DEVICE) {
-
+
res = host->bulkWrite(dev, bulk_out, data, transfer_len);
if (checkResult(res, bulk_out))
return -1;
@@ -242,7 +242,7 @@
if (csw.Signature != CSW_SIGNATURE) {
return -1;
}
-
+
USB_DBG("recv csw: status: %d", csw.Status);
// ModeSense?
@@ -250,27 +250,27 @@
USB_DBG("request mode sense");
return SCSIRequestSense();
}
-
+
// perform reset recovery
if ((csw.Status == 2) && (cmd[0] != 0x03)) {
-
+
// send Bulk-Only Mass Storage Reset request
res = host->controlWrite( dev,
USB_RECIPIENT_INTERFACE | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS,
BO_MASS_STORAGE_RESET,
0, msd_intf, NULL, 0);
-
+
// unstall both endpoints
res = host->controlWrite( dev,
USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
CLEAR_FEATURE,
0, bulk_in->getAddress(), NULL, 0);
-
+
res = host->controlWrite( dev,
USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
CLEAR_FEATURE,
0, bulk_out->getAddress(), NULL, 0);
-
+
}
return csw.Status;
@@ -304,20 +304,20 @@
int USBHostMSD::disk_initialize() {
USB_DBG("FILESYSTEM: init");
U16 i, timeout = 10;
-
+
getMaxLun();
-
+
for (i = 0; i < timeout; i++) {
Thread::wait(100);
if (!testUnitReady())
break;
}
-
+
if (i == timeout) {
disk_init = false;
return -1;
}
-
+
inquiry(0, 0);
disk_init = 1;
return readCapacity();
--- a/USBHostMSD/USBHostMSD.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostMSD/USBHostMSD.h Tue Jun 03 11:30:38 2014 +0100
@@ -24,7 +24,7 @@
#include "USBHost.h"
#include "FATFileSystem.h"
-/**
+/**
* A class to communicate a USB flash disk
*/
class USBHostMSD : public IUSBEnumerator, public FATFileSystem {
@@ -109,7 +109,7 @@
int msd_intf;
bool msd_device_found;
bool disk_init;
-
+
void init();
};
--- a/USBHostSerial/MtxCircBuffer.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostSerial/MtxCircBuffer.h Tue Jun 03 11:30:38 2014 +0100
@@ -24,7 +24,7 @@
template<typename T, int size>
class MtxCircBuffer {
public:
-
+
MtxCircBuffer() {
write = 0;
read = 0;
@@ -43,7 +43,7 @@
mtx.unlock();
return r;
}
-
+
void flush() {
write = 0;
read = 0;
--- a/USBHostSerial/USBHostSerial.cpp Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostSerial/USBHostSerial.cpp Tue Jun 03 11:30:38 2014 +0100
@@ -26,7 +26,7 @@
#if (USBHOST_SERIAL <= 1)
-USBHostSerial::USBHostSerial()
+USBHostSerial::USBHostSerial()
{
host = USBHost::getHostInst();
ports_found = 0;
@@ -46,9 +46,9 @@
bool USBHostSerial::connect() {
- if (dev)
+ if (dev)
{
- 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 (dev == d)
@@ -56,15 +56,15 @@
}
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) {
-
+
USB_DBG("Trying to connect serial device \r\n");
if(host->enumerate(d, this))
break;
-
+
USBEndpoint* bulk_in = d->getEndpoint(port_intf, BULK_ENDPOINT, IN);
USBEndpoint* bulk_out = d->getEndpoint(port_intf, BULK_ENDPOINT, OUT);
if (bulk_in && bulk_out)
@@ -84,7 +84,7 @@
/*virtual*/ bool USBHostSerial::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 (!ports_found &&
+ if (!ports_found &&
CHECK_INTERFACE(intf_class, intf_subclass, intf_protocol)) {
port_intf = intf_nb;
ports_found = true;
@@ -96,7 +96,7 @@
/*virtual*/ bool USBHostSerial::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
{
if (ports_found && (intf_nb == port_intf)) {
- if (type == BULK_ENDPOINT)
+ if (type == BULK_ENDPOINT)
return true;
}
return false;
@@ -106,7 +106,7 @@
//------------------------------------------------------------------------------
-USBHostMultiSerial::USBHostMultiSerial()
+USBHostMultiSerial::USBHostMultiSerial()
{
host = USBHost::getHostInst();
dev = NULL;
@@ -127,7 +127,7 @@
void USBHostMultiSerial::disconnect(void)
{
- for (int port = 0; port < USBHOST_SERIAL; port ++)
+ for (int port = 0; port < USBHOST_SERIAL; port ++)
{
if (ports[port])
{
@@ -141,9 +141,9 @@
bool USBHostMultiSerial::connect() {
- if (dev)
+ if (dev)
{
- 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 (dev == d)
@@ -151,16 +151,16 @@
}
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) {
-
+
USB_DBG("Trying to connect serial device \r\n");
if(host->enumerate(d, this))
break;
-
- for (int port = 0; port < ports_found; port ++)
+
+ for (int port = 0; port < ports_found; port ++)
{
USBEndpoint* bulk_in = d->getEndpoint(port_intf[port], BULK_ENDPOINT, IN);
USBEndpoint* bulk_out = d->getEndpoint(port_intf[port], BULK_ENDPOINT, OUT);
@@ -186,7 +186,7 @@
/*virtual*/ bool USBHostMultiSerial::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 ((ports_found < USBHOST_SERIAL) &&
+ if ((ports_found < USBHOST_SERIAL) &&
CHECK_INTERFACE(intf_class, intf_subclass, intf_protocol)) {
port_intf[ports_found++] = intf_nb;
return true;
@@ -197,7 +197,7 @@
/*virtual*/ bool USBHostMultiSerial::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
{
if ((ports_found > 0) && (intf_nb == port_intf[ports_found-1])) {
- if (type == BULK_ENDPOINT)
+ if (type == BULK_ENDPOINT)
return true;
}
return false;
@@ -209,7 +209,7 @@
#define SET_LINE_CODING 0x20
-USBHostSerialPort::USBHostSerialPort(): circ_buf()
+USBHostSerialPort::USBHostSerialPort(): circ_buf()
{
init();
}
@@ -230,7 +230,7 @@
circ_buf.flush();
}
-void USBHostSerialPort::connect(USBHost* _host, USBDeviceConnected * _dev,
+void USBHostSerialPort::connect(USBHost* _host, USBDeviceConnected * _dev,
uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out)
{
host = _host;
@@ -238,7 +238,7 @@
serial_intf = _serial_intf;
bulk_in = _bulk_in;
bulk_out = _bulk_out;
-
+
USB_INFO("New Serial device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, serial_intf);
dev->setName("Serial", serial_intf);
host->registerDriver(dev, serial_intf, this, &USBHostSerialPort::init);
@@ -289,7 +289,7 @@
line_coding.data_bits = bits;
line_coding.parity = parity;
line_coding.stop_bits = (stop_bits == 1) ? 0 : 2;
-
+
// set line coding
host->controlWrite( dev,
USB_RECIPIENT_INTERFACE | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS,
@@ -311,12 +311,12 @@
int USBHostSerialPort::writeBuf(const char* b, int s)
{
int c = 0;
- if (bulk_out)
+ 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 (host->bulkWrite(dev, bulk_out, (uint8_t *)(b+c), i) == USB_TYPE_OK)
c += i;
}
}
@@ -326,7 +326,7 @@
int USBHostSerialPort::readBuf(char* b, int s)
{
int i = 0;
- if (bulk_in)
+ if (bulk_in)
{
for (i = 0; i < s; )
b[i++] = getc();
--- a/USBHostSerial/USBHostSerial.h Fri Mar 07 16:00:46 2014 +0000
+++ b/USBHostSerial/USBHostSerial.h Tue Jun 03 11:30:38 2014 +0100
@@ -25,7 +25,7 @@
#include "Stream.h"
#include "MtxCircBuffer.h"
-/**
+/**
* A class to communicate a USB virtual serial port
*/
class USBHostSerialPort : public Stream {
@@ -39,7 +39,7 @@
RxIrq,
TxIrq
};
-
+
enum Parity {
None = 0,
Odd,
@@ -48,7 +48,7 @@
Space
};
- void connect(USBHost* _host, USBDeviceConnected * _dev,
+ void connect(USBHost* _host, USBDeviceConnected * _dev,
uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out);
/**
@@ -56,7 +56,7 @@
*
* @returns the number of bytes available
*/
- uint8_t available();
+ uint8_t available();
/**
* Attach a member function to call when a packet is received.
@@ -90,13 +90,13 @@
}
}
}
-
+
/** Set the baud rate of the serial port
*
* @param baudrate The baudrate of the serial port (default = 9600).
*/
void baud(int baudrate = 9600);
-
+
/** Set the transmission format used by the Serial port
*
* @param bits The number of bits in a word (default = 8)
@@ -110,7 +110,7 @@
protected:
virtual int _getc();
virtual int _putc(int c);
-
+
private:
USBHost * host;
USBDeviceConnected * dev;
@@ -132,7 +132,7 @@
uint8_t parity;
uint8_t data_bits;
} PACKED LINE_CODING;
-
+
LINE_CODING line_coding;
void rxHandler();
@@ -145,18 +145,18 @@
#if (USBHOST_SERIAL <= 1)
-class USBHostSerial : public IUSBEnumerator, public USBHostSerialPort
+class USBHostSerial : public IUSBEnumerator, public USBHostSerialPort
{
-public:
+public:
USBHostSerial();
-
+
/**
* Try to connect a serial device
*
* @return true if connection was successful
*/
bool connect();
-
+
void disconnect();
/**
@@ -165,7 +165,7 @@
* @returns true if a serial device is connected
*/
bool connected();
-
+
protected:
USBHost* host;
USBDeviceConnected* dev;
@@ -176,7 +176,7 @@
virtual void setVidPid(uint16_t vid, uint16_t pid);
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;
};
@@ -184,13 +184,13 @@
#else // (USBHOST_SERIAL > 1)
class USBHostMultiSerial : public IUSBEnumerator {
-public:
+public:
USBHostMultiSerial();
virtual ~USBHostMultiSerial();
-
- USBHostSerialPort* getPort(int port)
- {
- return port < USBHOST_SERIAL ? ports[port] : NULL;
+
+ USBHostSerialPort* getPort(int port)
+ {
+ return port < USBHOST_SERIAL ? ports[port] : NULL;
}
/**
@@ -199,7 +199,7 @@
* @return true if connection was successful
*/
bool connect();
-
+
void disconnect();
/**
@@ -208,7 +208,7 @@
* @returns true if a serial device is connected
*/
bool connected();
-
+
protected:
USBHost* host;
USBDeviceConnected* dev;
@@ -220,7 +220,7 @@
virtual void setVidPid(uint16_t vid, uint16_t pid);
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;
};
