forked from mfulz_github/qmk_firmware
Fixed Pipe_IsEndpointBound() function not taking the endpoint's direction into account.
Re-added Pipe_IsEndpointBound() calls to the CDC and RNDIS host class drivers, not that the function has the correct behaviour for devices with bidirectional endpoints.
This commit is contained in:
parent
bb1a036f09
commit
b6a4584a19
|
@ -182,7 +182,8 @@ static uint8_t DComp_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescri
|
||||||
|
|
||||||
uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);
|
uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);
|
||||||
|
|
||||||
if ((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT))
|
if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&
|
||||||
|
!(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,7 +179,8 @@ static uint8_t DComp_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDe
|
||||||
|
|
||||||
uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);
|
uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);
|
||||||
|
|
||||||
if ((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT))
|
if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&
|
||||||
|
!(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,6 +126,11 @@
|
||||||
*/
|
*/
|
||||||
#define ENDPOINT_EPNUM_MASK 0x07
|
#define ENDPOINT_EPNUM_MASK 0x07
|
||||||
|
|
||||||
|
/** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
|
||||||
|
* direction for comparing with the ENDPOINT_DESCRIPTOR_DIR_* masks.
|
||||||
|
*/
|
||||||
|
#define ENDPOINT_EPDIR_MASK 0x80
|
||||||
|
|
||||||
/** Endpoint bank size mask, for masking against endpoint addresses to retrieve the endpoint's
|
/** Endpoint bank size mask, for masking against endpoint addresses to retrieve the endpoint's
|
||||||
* bank size in the device.
|
* bank size in the device.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -78,8 +78,15 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
|
||||||
{
|
{
|
||||||
Pipe_SelectPipe(PNum);
|
Pipe_SelectPipe(PNum);
|
||||||
|
|
||||||
if (Pipe_IsConfigured() && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)))
|
uint8_t PipeToken = Pipe_GetPipeToken();
|
||||||
return true;
|
|
||||||
|
if (PipeToken != PIPE_TOKEN_SETUP)
|
||||||
|
PipeToken = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT));
|
||||||
|
|
||||||
|
if (Pipe_IsConfigured() && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)) && PipeToken)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Pipe_SelectPipe(PrevPipeNumber);
|
Pipe_SelectPipe(PrevPipeNumber);
|
||||||
|
|
|
@ -175,6 +175,11 @@
|
||||||
*/
|
*/
|
||||||
#define PIPE_EPNUM_MASK 0x0F
|
#define PIPE_EPNUM_MASK 0x0F
|
||||||
|
|
||||||
|
/** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
|
||||||
|
* direction for comparing with the ENDPOINT_DESCRIPTOR_DIR_* masks.
|
||||||
|
*/
|
||||||
|
#define PIPE_EPDIR_MASK 0x80
|
||||||
|
|
||||||
/* Pseudo-Function Macros: */
|
/* Pseudo-Function Macros: */
|
||||||
#if defined(__DOXYGEN__)
|
#if defined(__DOXYGEN__)
|
||||||
/** Indicates the number of bytes currently stored in the current pipes's selected bank.
|
/** Indicates the number of bytes currently stored in the current pipes's selected bank.
|
||||||
|
@ -805,9 +810,10 @@
|
||||||
/** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given
|
/** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given
|
||||||
* endpoint is found, it is automatically selected.
|
* endpoint is found, it is automatically selected.
|
||||||
*
|
*
|
||||||
* \param[in] EndpointAddress Address of the endpoint within the attached device to check
|
* \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check
|
||||||
*
|
*
|
||||||
* \return Boolean true if a pipe bound to the given endpoint address is found, false otherwise
|
* \return Boolean true if a pipe bound to the given endpoint address of the specified direction is found, false
|
||||||
|
* otherwise
|
||||||
*/
|
*/
|
||||||
bool Pipe_IsEndpointBound(const uint8_t EndpointAddress);
|
bool Pipe_IsEndpointBound(const uint8_t EndpointAddress);
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
* - Fixed DFU bootloader programming not discarding the correct number of filler bytes from the host when non-aligned programming
|
* - Fixed DFU bootloader programming not discarding the correct number of filler bytes from the host when non-aligned programming
|
||||||
* ranges are specified (thanks to Thomas Bleeker)
|
* ranges are specified (thanks to Thomas Bleeker)
|
||||||
* - Fixed CDC and RNDIS host demos and class drivers - bidirectional endpoints should use two seperate pipes, not one half-duplex pipe
|
* - Fixed CDC and RNDIS host demos and class drivers - bidirectional endpoints should use two seperate pipes, not one half-duplex pipe
|
||||||
|
* - Fixed Pipe_IsEndpointBound() not taking the endpoint's direction into account
|
||||||
*
|
*
|
||||||
* \section Sec_ChangeLog091223 Version 091223
|
* \section Sec_ChangeLog091223 Version 091223
|
||||||
*
|
*
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
* packed into a single USB packet. This means that the sending of MIDI events will now be delayed until the MIDI send
|
* packed into a single USB packet. This means that the sending of MIDI events will now be delayed until the MIDI send
|
||||||
* pipe bank is full. To override this new behaviour and revert to the previous behaviour, the user application may manually
|
* pipe bank is full. To override this new behaviour and revert to the previous behaviour, the user application may manually
|
||||||
* flush the queued event(s) to the device by calling \ref MIDI_Host_Flush().
|
* flush the queued event(s) to the device by calling \ref MIDI_Host_Flush().
|
||||||
|
* - The Pipe_IsEndpointBound() function now takes the endpoint's direction into account, by checking if the MSB of the endpoint's address
|
||||||
|
* is set to denote IN endpoints. If the previous functionality where the direction is to be discounted is required, mask the endpoint
|
||||||
|
* address against the \ref PIPE_EPNUM_MASK token before calling Pipe_IsEndpointBound().
|
||||||
*
|
*
|
||||||
* <b>Device Mode</b>
|
* <b>Device Mode</b>
|
||||||
* - The MIDI Device Class driver send and receive routines now operate on packed events, where multiple MIDI events may be
|
* - The MIDI Device Class driver send and receive routines now operate on packed events, where multiple MIDI events may be
|
||||||
|
|
|
@ -43,8 +43,8 @@
|
||||||
char PROGMEM HTTP200Header[] = "HTTP/1.1 200 OK\r\n"
|
char PROGMEM HTTP200Header[] = "HTTP/1.1 200 OK\r\n"
|
||||||
"Server: LUFA RNDIS\r\n"
|
"Server: LUFA RNDIS\r\n"
|
||||||
"Connection: close\r\n"
|
"Connection: close\r\n"
|
||||||
"MIME-version: 1.0\r\n"
|
"MIME-version: 1.0\r\n"
|
||||||
"Content-Type: ";
|
"Content-Type: ";
|
||||||
|
|
||||||
/** HTTP server response header, for transmission before a resource not found error. This indicates to the host that the given
|
/** HTTP server response header, for transmission before a resource not found error. This indicates to the host that the given
|
||||||
* given URL is invalid, and gives extra error information.
|
* given URL is invalid, and gives extra error information.
|
||||||
|
@ -52,9 +52,9 @@ char PROGMEM HTTP200Header[] = "HTTP/1.1 200 OK\r\n"
|
||||||
char PROGMEM HTTP404Header[] = "HTTP/1.1 404 Not Found\r\n"
|
char PROGMEM HTTP404Header[] = "HTTP/1.1 404 Not Found\r\n"
|
||||||
"Server: LUFA RNDIS\r\n"
|
"Server: LUFA RNDIS\r\n"
|
||||||
"Connection: close\r\n"
|
"Connection: close\r\n"
|
||||||
"MIME-version: 1.0\r\n"
|
"MIME-version: 1.0\r\n"
|
||||||
"Content-Type: text/plain\r\n\r\n"
|
"Content-Type: text/plain\r\n\r\n"
|
||||||
"Error 404: File Not Found";
|
"Error 404: File Not Found";
|
||||||
|
|
||||||
/** Default MIME type sent if no other MIME type can be determined */
|
/** Default MIME type sent if no other MIME type can be determined */
|
||||||
char PROGMEM DefaultMIMEType[] = "text/plain";
|
char PROGMEM DefaultMIMEType[] = "text/plain";
|
||||||
|
@ -97,12 +97,9 @@ void WebserverApp_Callback(void)
|
||||||
|
|
||||||
if (uip_aborted() || uip_timedout() || uip_closed())
|
if (uip_aborted() || uip_timedout() || uip_closed())
|
||||||
{
|
{
|
||||||
/* Connection is being terminated for some reason - close file handle if open */
|
/* Connection is being terminated for some reason - close file handle */
|
||||||
if (AppState->FileOpen)
|
f_close(&AppState->FileHandle);
|
||||||
{
|
AppState->FileOpen = false;
|
||||||
f_close(&AppState->FileHandle);
|
|
||||||
AppState->FileOpen = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Lock to the closed state so that no further processing will occur on the connection */
|
/* Lock to the closed state so that no further processing will occur on the connection */
|
||||||
AppState->CurrentState = WEBSERVER_STATE_Closed;
|
AppState->CurrentState = WEBSERVER_STATE_Closed;
|
||||||
|
@ -159,7 +156,7 @@ void WebserverApp_Callback(void)
|
||||||
static void Webserver_OpenRequestedFile(void)
|
static void Webserver_OpenRequestedFile(void)
|
||||||
{
|
{
|
||||||
uip_tcp_appstate_t* const AppState = &uip_conn->appstate;
|
uip_tcp_appstate_t* const AppState = &uip_conn->appstate;
|
||||||
char* AppData = (char*)uip_appdata;
|
char* const AppData = (char*)uip_appdata;
|
||||||
|
|
||||||
/* No HTTP header received from the client, abort processing */
|
/* No HTTP header received from the client, abort processing */
|
||||||
if (!(uip_newdata()))
|
if (!(uip_newdata()))
|
||||||
|
@ -199,12 +196,12 @@ static void Webserver_OpenRequestedFile(void)
|
||||||
static void Webserver_SendResponseHeader(void)
|
static void Webserver_SendResponseHeader(void)
|
||||||
{
|
{
|
||||||
uip_tcp_appstate_t* const AppState = &uip_conn->appstate;
|
uip_tcp_appstate_t* const AppState = &uip_conn->appstate;
|
||||||
char* AppData = (char*)uip_appdata;
|
char* const AppData = (char*)uip_appdata;
|
||||||
|
|
||||||
char* HeaderToSend;
|
char* HeaderToSend;
|
||||||
uint16_t HeaderLength;
|
uint16_t HeaderLength;
|
||||||
|
|
||||||
/* Determine what HTTP header should be sent to the client */
|
/* Determine which HTTP header should be sent to the client */
|
||||||
if (AppState->FileOpen)
|
if (AppState->FileOpen)
|
||||||
{
|
{
|
||||||
HeaderToSend = HTTP200Header;
|
HeaderToSend = HTTP200Header;
|
||||||
|
@ -216,6 +213,7 @@ static void Webserver_SendResponseHeader(void)
|
||||||
AppState->NextState = WEBSERVER_STATE_Closing;
|
AppState->NextState = WEBSERVER_STATE_Closing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copy over the HTTP response header and send it to the receiving client */
|
||||||
HeaderLength = strlen_P(HeaderToSend);
|
HeaderLength = strlen_P(HeaderToSend);
|
||||||
strncpy_P(AppData, HeaderToSend, HeaderLength);
|
strncpy_P(AppData, HeaderToSend, HeaderLength);
|
||||||
uip_send(AppData, HeaderLength);
|
uip_send(AppData, HeaderLength);
|
||||||
|
@ -227,7 +225,7 @@ static void Webserver_SendResponseHeader(void)
|
||||||
static void Webserver_SendMIMETypeHeader(void)
|
static void Webserver_SendMIMETypeHeader(void)
|
||||||
{
|
{
|
||||||
uip_tcp_appstate_t* const AppState = &uip_conn->appstate;
|
uip_tcp_appstate_t* const AppState = &uip_conn->appstate;
|
||||||
char* AppData = (char*)uip_appdata;
|
char* const AppData = (char*)uip_appdata;
|
||||||
|
|
||||||
char* Extension = strpbrk(AppState->FileName, ".");
|
char* Extension = strpbrk(AppState->FileName, ".");
|
||||||
uint16_t MIMEHeaderLength = 0;
|
uint16_t MIMEHeaderLength = 0;
|
||||||
|
@ -272,7 +270,7 @@ static void Webserver_SendMIMETypeHeader(void)
|
||||||
static void Webserver_SendData(void)
|
static void Webserver_SendData(void)
|
||||||
{
|
{
|
||||||
uip_tcp_appstate_t* const AppState = &uip_conn->appstate;
|
uip_tcp_appstate_t* const AppState = &uip_conn->appstate;
|
||||||
char* AppData = (char*)uip_appdata;
|
char* const AppData = (char*)uip_appdata;
|
||||||
|
|
||||||
/* Must determine the maximum segment size to determine maximum file chunk size */
|
/* Must determine the maximum segment size to determine maximum file chunk size */
|
||||||
uint16_t MaxSegmentSize = uip_mss();
|
uint16_t MaxSegmentSize = uip_mss();
|
||||||
|
|
|
@ -134,8 +134,6 @@ SRC = $(TARGET).c \
|
||||||
Lib/DataflashManager.c \
|
Lib/DataflashManager.c \
|
||||||
Lib/uip/uip.c \
|
Lib/uip/uip.c \
|
||||||
Lib/uip/uip_arp.c \
|
Lib/uip/uip_arp.c \
|
||||||
Lib/uip/uiplib.c \
|
|
||||||
Lib/uip/psock.c \
|
|
||||||
Lib/uip/timer.c \
|
Lib/uip/timer.c \
|
||||||
Lib/uip/uip-neighbor.c \
|
Lib/uip/uip-neighbor.c \
|
||||||
Lib/uip/conf/clock-arch.c \
|
Lib/uip/conf/clock-arch.c \
|
||||||
|
|
Loading…
Reference in New Issue