Adaptation of the official mbed USBHost repository to work with the LPC4088 Display Module
Dependents: DMSupport DMSupport DMSupport DMSupport
Fork of DM_USBHost by
Diff: USBHost/USBHost.cpp
- Revision:
- 27:aa2fd412f1d3
- Parent:
- 24:868cbfe611a7
- Child:
- 30:ffec1f271b7c
diff -r 607951c26872 -r aa2fd412f1d3 USBHost/USBHost.cpp --- a/USBHost/USBHost.cpp Mon Aug 18 13:45:26 2014 +0100 +++ b/USBHost/USBHost.cpp Tue Dec 02 15:16:39 2014 +0000 @@ -53,7 +53,8 @@ bool interruptListState; USBEndpoint * ep; uint8_t i, j, res, timeout_set_addr = 10; - uint8_t buf[8]; +#define SAFE_USB_PROCESS_BUFF_SIZE (8) + uint8_t* buf = getSafeMem(SAFE_USB_PROCESS_BUFF_SIZE); bool too_many_hub; int idx; @@ -121,7 +122,7 @@ // 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); + res = getDeviceDescriptor(&devices[i], buf, SAFE_USB_PROCESS_BUFF_SIZE); if (res != USB_TYPE_OK) { USB_ERR("usb_thread could not read dev descr"); @@ -143,7 +144,7 @@ // try to read again the device descriptor to check if the device // answers to its new address - res = getDeviceDescriptor(&devices[i], buf, 8); + res = getDeviceDescriptor(&devices[i], buf, SAFE_USB_PROCESS_BUFF_SIZE); if (res == USB_TYPE_OK) { break; @@ -223,10 +224,10 @@ #if DEBUG_TRANSFER if (ep->getDir() == IN) { buf_transfer = ep->getBufStart(); - printf("READ SUCCESS [%d bytes transferred - td: 0x%08X] on ep: [%p - addr: %02X]: ", ep->getLengthTransferred(), usb_msg->td_addr, ep, ep->getAddress()); + USB_DBG_X("READ SUCCESS [%d bytes transferred - td: 0x%08X] on ep: [%p - addr: %02X]: ", ep->getLengthTransferred(), usb_msg->td_addr, ep, ep->getAddress()); for (int i = 0; i < ep->getLengthTransferred(); i++) - printf("%02X ", buf_transfer[i]); - printf("\r\n\r\n"); + USB_DBG_X("%02X ", buf_transfer[i]); + USB_DBG_X("\r\n\r\n"); } #endif ep->call(); @@ -261,6 +262,9 @@ tailInterruptEndpoint = NULL; lenReportDescr = 0; + + setupPacket = getSafeMem(SAFE_USB_HOST_SETUP_PACKET_BUFF_SIZE); + data = getSafeMem(SAFE_USB_HOST_DATA_BUFF_SIZE); controlEndpointAllocated = false; @@ -678,22 +682,22 @@ const char * type_str = (type == BULK_ENDPOINT) ? "BULK" : ((type == INTERRUPT_ENDPOINT) ? "INTERRUPT" : ((type == CONTROL_ENDPOINT) ? "CONTROL" : "ISOCHRONOUS")); - printf("State of %s:\r\n", type_str); + USB_DBG_X("State of %s:\r\n", type_str); while (hced != NULL) { uint8_t dir = ((hced->control & (3 << 11)) >> 11); - printf("hced: %p [ADDR: %d, DIR: %s, EP_NB: 0x%X]\r\n", hced, + USB_DBG_X("hced: %p [ADDR: %d, DIR: %s, EP_NB: 0x%X]\r\n", hced, hced->control & 0x7f, (dir == 1) ? "OUT" : ((dir == 0) ? "FROM_TD":"IN"), (hced->control & (0xf << 7)) >> 7); hctd = (HCTD *)((uint32_t)(hced->headTD) & ~(0xf)); while (hctd != hced->tailTD) { - printf("\thctd: %p [DIR: %s]\r\n", hctd, ((hctd->control & (3 << 19)) >> 19) == 1 ? "OUT" : "IN"); + USB_DBG_X("\thctd: %p [DIR: %s]\r\n", hctd, ((hctd->control & (3 << 19)) >> 19) == 1 ? "OUT" : "IN"); hctd = hctd->nextTD; } - printf("\thctd: %p\r\n", hctd); + USB_DBG_X("\thctd: %p\r\n", hctd); hced = hced->nextED; } - printf("\r\n\r\n"); + USB_DBG_X("\r\n\r\n"); #endif } @@ -701,6 +705,9 @@ // add a transfer on the TD linked list USB_TYPE USBHost::addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) { + ASSERT_MEM_REGION(buf); + + td_mutex.lock(); // allocate a TD which will be freed in TDcompletion @@ -860,7 +867,7 @@ pEnumerator->setVidPid( data[8] | (data[9] << 8), data[10] | (data[11] << 8) ); - res = getConfigurationDescriptor(dev, data, sizeof(data), &total_conf_descr_length); + res = getConfigurationDescriptor(dev, data, SAFE_USB_HOST_DATA_BUFF_SIZE/*sizeof(data)*/, &total_conf_descr_length); if (res != USB_TYPE_OK) { return res; } @@ -868,8 +875,8 @@ #if (DEBUG > 3) USB_DBG("CONFIGURATION DESCRIPTOR:\r\n"); for (int i = 0; i < total_conf_descr_length; i++) - printf("%02X ", data[i]); - printf("\r\n\r\n"); + USB_DBG_X("%02X ", data[i]); + USB_DBG_X("\r\n\r\n"); #endif // Parse the configuration descriptor @@ -990,8 +997,9 @@ return generalTransfer(dev, ep, buf, len, blocking, INTERRUPT_ENDPOINT, false); } -USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking, ENDPOINT_TYPE type, bool write) { - +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()); @@ -1031,8 +1039,8 @@ if (write) { USB_DBG_TRANSFER("%s WRITE buffer", type_str); for (int i = 0; i < ep->getLengthTransferred(); i++) - printf("%02X ", buf[i]); - printf("\r\n\r\n"); + USB_DBG_X("%02X ", buf[i]); + USB_DBG_X("\r\n\r\n"); } #endif addTransfer(ep, buf, len); @@ -1087,12 +1095,12 @@ #if DEBUG_TRANSFER USB_DBG_TRANSFER("SETUP PACKET: "); for (int i = 0; i < 8; i++) - printf("%01X ", setupPacket[i]); - printf("\r\n"); + USB_DBG_X("%01X ", setupPacket[i]); + USB_DBG_X("\r\n"); #endif control->setNextToken(TD_SETUP); - addTransfer(control, (uint8_t*)setupPacket, 8); + addTransfer(control, (uint8_t*)setupPacket, SAFE_USB_HOST_SETUP_PACKET_BUFF_SIZE); control->ep_queue.get(); res = control->getState(); @@ -1106,6 +1114,7 @@ if (length_transfer) { token = (write) ? TD_OUT : TD_IN; control->setNextToken(token); + addTransfer(control, (uint8_t *)buf, length_transfer); control->ep_queue.get(); @@ -1116,13 +1125,13 @@ if (write) { USB_DBG_TRANSFER("CONTROL WRITE buffer"); for (int i = 0; i < control->getLengthTransferred(); i++) - printf("%02X ", buf[i]); - printf("\r\n\r\n"); + USB_DBG_X("%02X ", buf[i]); + USB_DBG_X("\r\n\r\n"); } else { USB_DBG_TRANSFER("CONTROL READ SUCCESS [%d bytes transferred]", control->getLengthTransferred()); for (int i = 0; i < control->getLengthTransferred(); i++) - printf("%02X ", buf[i]); - printf("\r\n\r\n"); + USB_DBG_X("%02X ", buf[i]); + USB_DBG_X("\r\n\r\n"); } #endif @@ -1133,6 +1142,7 @@ token = (write) ? TD_IN : TD_OUT; control->setNextToken(token); + addTransfer(control, NULL, 0); control->ep_queue.get();