From f174f2a92059b2f9e9ebd42f984ce82a8accb924 Mon Sep 17 00:00:00 2001 From: Michel Jaouen Date: Mon, 5 Dec 2016 15:44:10 +0100 Subject: [PATCH] USBHOST : add return value to queue transfer modify add transfer to support return value. --- .../USBHost/USBHost/USBEndpoint.cpp | 3 ++- .../unsupported/USBHost/USBHost/USBEndpoint.h | 2 +- .../unsupported/USBHost/USBHost/USBHost.cpp | 23 ++++++++++--------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/features/unsupported/USBHost/USBHost/USBEndpoint.cpp b/features/unsupported/USBHost/USBHost/USBEndpoint.cpp index 6e07421855..ec3989b89a 100644 --- a/features/unsupported/USBHost/USBHost/USBEndpoint.cpp +++ b/features/unsupported/USBHost/USBHost/USBEndpoint.cpp @@ -132,7 +132,7 @@ const char * USBEndpoint::getStateString() { return type_string[state].str; } -void USBEndpoint::queueTransfer() +USB_TYPE USBEndpoint::queueTransfer() { transfer_len = (uint32_t)td_current->bufEnd - (uint32_t)td_current->currBufPtr + 1; transferred = transfer_len; @@ -142,6 +142,7 @@ void USBEndpoint::queueTransfer() state = USB_TYPE_PROCESSING; td_current->nextTD = (hcTd*)td_next; hced->tailTD = td_next; + return USB_TYPE_PROCESSING; } void USBEndpoint::unqueueTransfer(volatile HCTD * td) diff --git a/features/unsupported/USBHost/USBHost/USBEndpoint.h b/features/unsupported/USBHost/USBHost/USBEndpoint.h index 64b320f213..893fd07cbe 100644 --- a/features/unsupported/USBHost/USBHost/USBEndpoint.h +++ b/features/unsupported/USBHost/USBHost/USBEndpoint.h @@ -67,7 +67,7 @@ public: /** * Queue a transfer on the endpoint */ - void queueTransfer(); + USB_TYPE queueTransfer(); /** * Unqueue a transfer from the endpoint diff --git a/features/unsupported/USBHost/USBHost/USBHost.cpp b/features/unsupported/USBHost/USBHost/USBHost.cpp index 0ff47c5eeb..af7b83670e 100644 --- a/features/unsupported/USBHost/USBHost/USBHost.cpp +++ b/features/unsupported/USBHost/USBHost/USBHost.cpp @@ -699,7 +699,8 @@ void USBHost::printList(ENDPOINT_TYPE type) // add a transfer on the TD linked list USB_TYPE USBHost::addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) { - td_mutex.lock(); + USB_TYPE ret=USB_TYPE_PROCESSING; + td_mutex.lock(); // allocate a TD which will be freed in TDcompletion volatile HCTD * td = ed->getNextTD(); @@ -734,7 +735,7 @@ USB_TYPE USBHost::addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) td_mutex.unlock(); - return USB_TYPE_PROCESSING; + return ret; } @@ -1033,9 +1034,9 @@ USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, ui printf("\r\n\r\n"); } #endif - addTransfer(ep, buf, len); + res = addTransfer(ep, buf, len); - if (blocking) { + if ((blocking)&& (res == USB_TYPE_PROCESSING)) { ep->ep_queue.get(); res = ep->getState(); @@ -1049,7 +1050,7 @@ USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, ui return USB_TYPE_OK; } - return USB_TYPE_PROCESSING; + return res; } @@ -1090,9 +1091,9 @@ USB_TYPE USBHost::controlTransfer(USBDeviceConnected * dev, uint8_t requestType, #endif control->setNextToken(TD_SETUP); - addTransfer(control, (uint8_t*)setupPacket, 8); + res = addTransfer(control, (uint8_t*)setupPacket, 8); - control->ep_queue.get(); + if (res == USB_TYPE_PROCESSING) control->ep_queue.get(); res = control->getState(); USB_DBG_TRANSFER("CONTROL setup stage %s", control->getStateString()); @@ -1104,9 +1105,9 @@ USB_TYPE USBHost::controlTransfer(USBDeviceConnected * dev, uint8_t requestType, if (length_transfer) { token = (write) ? TD_OUT : TD_IN; control->setNextToken(token); - addTransfer(control, (uint8_t *)buf, length_transfer); + res = addTransfer(control, (uint8_t *)buf, length_transfer); - control->ep_queue.get(); + if (res == USB_TYPE_PROCESSING) control->ep_queue.get(); res = control->getState(); #if DEBUG_TRANSFER @@ -1131,9 +1132,9 @@ USB_TYPE USBHost::controlTransfer(USBDeviceConnected * dev, uint8_t requestType, token = (write) ? TD_IN : TD_OUT; control->setNextToken(token); - addTransfer(control, NULL, 0); + res = addTransfer(control, NULL, 0); - control->ep_queue.get(); + if (res == USB_TYPE_PROCESSING) control->ep_queue.get(); res = control->getState(); USB_DBG_TRANSFER("CONTROL ack stage %s", control->getStateString());