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);
 | 
			
		||||
	
 | 
			
		||||
		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;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -179,7 +179,8 @@ static uint8_t DComp_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDe
 | 
			
		||||
	
 | 
			
		||||
		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;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -126,6 +126,11 @@
 | 
			
		||||
			 */
 | 
			
		||||
			#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
 | 
			
		||||
			 *  bank size in the device.
 | 
			
		||||
			 */
 | 
			
		||||
 | 
			
		||||
@ -78,9 +78,16 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
 | 
			
		||||
	{
 | 
			
		||||
		Pipe_SelectPipe(PNum);
 | 
			
		||||
		
 | 
			
		||||
		if (Pipe_IsConfigured() && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)))
 | 
			
		||||
		uint8_t PipeToken = Pipe_GetPipeToken();
 | 
			
		||||
 | 
			
		||||
		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);
 | 
			
		||||
	return false;
 | 
			
		||||
 | 
			
		||||
@ -175,6 +175,11 @@
 | 
			
		||||
			 */
 | 
			
		||||
			#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: */
 | 
			
		||||
			#if defined(__DOXYGEN__)
 | 
			
		||||
				/** 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
 | 
			
		||||
			 *  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);
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
@ -48,6 +48,7 @@
 | 
			
		||||
  *  - 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)
 | 
			
		||||
  *  - 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
 | 
			
		||||
  *
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 *      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().
 | 
			
		||||
 *    - 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>
 | 
			
		||||
 *    - The MIDI Device Class driver send and receive routines now operate on packed events, where multiple MIDI events may be
 | 
			
		||||
 | 
			
		||||
@ -97,12 +97,9 @@ void WebserverApp_Callback(void)
 | 
			
		||||
 | 
			
		||||
	if (uip_aborted() || uip_timedout() || uip_closed())
 | 
			
		||||
	{
 | 
			
		||||
		/* Connection is being terminated for some reason - close file handle if open */
 | 
			
		||||
		if (AppState->FileOpen)
 | 
			
		||||
		{
 | 
			
		||||
		/* Connection is being terminated for some reason - close file handle */
 | 
			
		||||
		f_close(&AppState->FileHandle);
 | 
			
		||||
		AppState->FileOpen = false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		/* Lock to the closed state so that no further processing will occur on the connection */
 | 
			
		||||
		AppState->CurrentState  = WEBSERVER_STATE_Closed;
 | 
			
		||||
@ -159,7 +156,7 @@ void WebserverApp_Callback(void)
 | 
			
		||||
static void Webserver_OpenRequestedFile(void)
 | 
			
		||||
{
 | 
			
		||||
	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 */
 | 
			
		||||
	if (!(uip_newdata()))
 | 
			
		||||
@ -199,12 +196,12 @@ static void Webserver_OpenRequestedFile(void)
 | 
			
		||||
static void Webserver_SendResponseHeader(void)
 | 
			
		||||
{
 | 
			
		||||
	uip_tcp_appstate_t* const AppState    = &uip_conn->appstate;
 | 
			
		||||
	char*                     AppData     = (char*)uip_appdata;
 | 
			
		||||
	char*               const AppData     = (char*)uip_appdata;
 | 
			
		||||
 | 
			
		||||
	char*    HeaderToSend;
 | 
			
		||||
	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)
 | 
			
		||||
	{
 | 
			
		||||
		HeaderToSend = HTTP200Header;
 | 
			
		||||
@ -216,6 +213,7 @@ static void Webserver_SendResponseHeader(void)
 | 
			
		||||
		AppState->NextState = WEBSERVER_STATE_Closing;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Copy over the HTTP response header and send it to the receiving client */
 | 
			
		||||
	HeaderLength = strlen_P(HeaderToSend);
 | 
			
		||||
	strncpy_P(AppData, HeaderToSend, HeaderLength);
 | 
			
		||||
	uip_send(AppData, HeaderLength);
 | 
			
		||||
@ -227,7 +225,7 @@ static void Webserver_SendResponseHeader(void)
 | 
			
		||||
static void Webserver_SendMIMETypeHeader(void)
 | 
			
		||||
{
 | 
			
		||||
	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, ".");
 | 
			
		||||
	uint16_t MIMEHeaderLength = 0;
 | 
			
		||||
@ -272,7 +270,7 @@ static void Webserver_SendMIMETypeHeader(void)
 | 
			
		||||
static void Webserver_SendData(void)
 | 
			
		||||
{
 | 
			
		||||
	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 */
 | 
			
		||||
	uint16_t MaxSegmentSize = uip_mss();
 | 
			
		||||
 | 
			
		||||
@ -134,8 +134,6 @@ SRC = $(TARGET).c                                                 \
 | 
			
		||||
	  Lib/DataflashManager.c                                      \
 | 
			
		||||
	  Lib/uip/uip.c                                               \
 | 
			
		||||
	  Lib/uip/uip_arp.c                                           \
 | 
			
		||||
	  Lib/uip/uiplib.c                                            \
 | 
			
		||||
	  Lib/uip/psock.c                                             \
 | 
			
		||||
	  Lib/uip/timer.c                                             \
 | 
			
		||||
	  Lib/uip/uip-neighbor.c                                      \
 | 
			
		||||
	  Lib/uip/conf/clock-arch.c                                   \
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user