Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of USBHost by
Diff: USBHost/USBHost.cpp
- Revision:
- 9:7671b6a8c363
- Parent:
- 8:93da8ea2708b
- Child:
- 10:0c11cf1cc218
--- a/USBHost/USBHost.cpp Thu Mar 14 11:49:53 2013 +0000
+++ b/USBHost/USBHost.cpp Thu Mar 14 14:20:03 2013 +0000
@@ -68,9 +68,9 @@
#endif
while(1) {
- osEvent evt = queue_usb_event.get();
+ osEvent evt = mail_usb_event.get();
- if (evt.status == osEventMessage) {
+ if (evt.status == osEventMail) {
l4 = !l4;
message_t * usb_msg = (message_t*)evt.value.p;
@@ -96,6 +96,7 @@
if (i == MAX_DEVICE_CONNECTED) {
USB_ERR("Too many device connected!!\r\n");
+ deviceInited[i] = false;
usb_mutex.unlock();
continue;
}
@@ -242,7 +243,7 @@
break;
}
- mpool_usb_event.free(usb_msg);
+ mail_usb_event.free(usb_msg);
}
}
}
@@ -317,13 +318,14 @@
if (ep->getType() != CONTROL_ENDPOINT) {
// callback on the processed td will be called from the usb_thread (not in ISR)
- message_t * usb_msg = mpool_usb_event.alloc();
+ message_t * usb_msg = mail_usb_event.alloc();
usb_msg->event_id = TD_PROCESSED_EVENT;
usb_msg->td_addr = (void *)td;
usb_msg->td_state = state;
- queue_usb_event.put(usb_msg);
+ mail_usb_event.put(usb_msg);
}
ep->setState(state);
+ ep->ep_queue.put((uint8_t*)1);
}
}
}
@@ -351,13 +353,13 @@
return;
}
- message_t * usb_msg = mpool_usb_event.alloc();
+ message_t * usb_msg = mail_usb_event.alloc();
usb_msg->event_id = DEVICE_CONNECTED_EVENT;
usb_msg->hub = hub;
usb_msg->port = port;
usb_msg->lowSpeed = lowSpeed;
usb_msg->hub_parent = hub_parent;
- queue_usb_event.put(usb_msg);
+ mail_usb_event.put(usb_msg);
}
/*
@@ -375,12 +377,12 @@
return;
}
- message_t * usb_msg = mpool_usb_event.alloc();
+ message_t * usb_msg = mail_usb_event.alloc();
usb_msg->event_id = DEVICE_DISCONNECTED_EVENT;
usb_msg->hub = hub;
usb_msg->port = port;
usb_msg->hub_parent = hub_parent;
- queue_usb_event.put(usb_msg);
+ mail_usb_event.put(usb_msg);
}
void USBHost::freeDevice(USBDeviceConnected * dev)
@@ -528,7 +530,7 @@
int index = findDevice(dev);
if (index != -1) {
USB_DBG("Resetting hub %d, port %d\n", dev->getHub(), dev->getPort());
- wait_ms(100);
+ Thread::wait(100);
if (dev->getHub() == 0) {
resetRootHub();
}
@@ -537,7 +539,7 @@
dev->getHubParent()->portReset(dev->getPort());
}
#endif
- wait_ms(100);
+ Thread::wait(100);
deviceReset[index] = true;
return USB_TYPE_OK;
}
@@ -689,6 +691,7 @@
// add a transfer on the TD linked list
USB_TYPE USBHost::addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len)
{
+ td_mutex.lock();
// allocate a TD which will be freed in TDcompletion
volatile HCTD * td = ed->getNextTD();
@@ -720,6 +723,8 @@
ed->queueTransfer();
printList(type);
enableList(type);
+
+ td_mutex.unlock();
return USB_TYPE_PROCESSING;
}
@@ -887,7 +892,6 @@
return USB_TYPE_OK;
}
-
// this method fills the USBDeviceConnected object: class,.... . It also add endpoints found in the descriptor.
void USBHost::parseConfDescr(USBDeviceConnected * dev, uint8_t * conf_descr, uint32_t len, IUSBEnumerator* pEnumerator)
{
@@ -985,11 +989,11 @@
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
+ usb_mutex.lock();
+
USB_TYPE res;
ENDPOINT_DIRECTION dir = (write) ? OUT : IN;
- usb_mutex.lock();
-
if (dev == NULL) {
USB_ERR("dev NULL");
usb_mutex.unlock();
@@ -1032,7 +1036,8 @@
if (blocking) {
- while((res = ep->getState()) == USB_TYPE_PROCESSING);
+ ep->ep_queue.get();
+ res = ep->getState();
USB_DBG_TRANSFER("%s TRANSFER res: %s on ep: %p\r\n", type_str, ep->getStateString(), ep);
@@ -1089,7 +1094,8 @@
control->setNextToken(TD_SETUP);
addTransfer(control, (uint8_t*)setupPacket, 8);
- while((res = control->getState()) == USB_TYPE_PROCESSING);
+ control->ep_queue.get();
+ res = control->getState();
USB_DBG_TRANSFER("CONTROL setup stage %s", control->getStateString());
@@ -1103,7 +1109,8 @@
control->setNextToken(token);
addTransfer(control, (uint8_t *)buf, length_transfer);
- while((res = control->getState()) == USB_TYPE_PROCESSING);
+ control->ep_queue.get();
+ res = control->getState();
#if DEBUG_TRANSFER
USB_DBG_TRANSFER("CONTROL %s stage %s", (write) ? "WRITE" : "READ", control->getStateString());
@@ -1130,7 +1137,8 @@
control->setNextToken(token);
addTransfer(control, NULL, 0);
- while((res = control->getState()) == USB_TYPE_PROCESSING);
+ control->ep_queue.get();
+ res = control->getState();
USB_DBG_TRANSFER("CONTROL ack stage %s", control->getStateString());
usb_mutex.unlock();
