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.
Dependents: RGA-MJPEG_VideoDemo
Fork of USBHost_custom 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();
