mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 21:32:31 +01:00 
			
		
		
		
	Much more efficient algorithm for the Endpoint/Pipe configuration routine of unordered endpoints/pipes - only reconfigure the endpoints and pipes above the newly configured endpoint/pipe, and don't cache existing endpoint/pipe configuration before use to save SRAM.
This commit is contained in:
		
							parent
							
								
									5489af7fa0
								
							
						
					
					
						commit
						bfa622d27e
					
				| @ -53,42 +53,37 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, | |||||||
| 
 | 
 | ||||||
| 	return Endpoint_IsConfigured(); | 	return Endpoint_IsConfigured(); | ||||||
| #else	 | #else	 | ||||||
| 	uint8_t UECFG0XTemp[ENDPOINT_TOTAL_ENDPOINTS]; | 	for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) | ||||||
| 	uint8_t UECFG1XTemp[ENDPOINT_TOTAL_ENDPOINTS]; |  | ||||||
| 	uint8_t UEIENXTemp[ENDPOINT_TOTAL_ENDPOINTS]; |  | ||||||
| 	 |  | ||||||
| 	for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) |  | ||||||
| 	{ | 	{ | ||||||
|  | 		uint8_t UECFG0XTemp; | ||||||
|  | 		uint8_t UECFG1XTemp; | ||||||
|  | 		uint8_t UEIENXTemp; | ||||||
|  | 
 | ||||||
| 		Endpoint_SelectEndpoint(EPNum); | 		Endpoint_SelectEndpoint(EPNum); | ||||||
| 		UECFG0XTemp[EPNum] = UECFG0X; |  | ||||||
| 		UECFG1XTemp[EPNum] = UECFG1X; |  | ||||||
| 		UEIENXTemp[EPNum]  = UEIENX; |  | ||||||
| 	} |  | ||||||
| 		 | 		 | ||||||
| 	UECFG0XTemp[Number] = UECFG0XData; | 		if (EPNum == Number) | ||||||
| 	UECFG1XTemp[Number] = UECFG1XData; | 		{ | ||||||
| 	UEIENXTemp[Number]  = 0; | 			UECFG0XTemp = UECFG0XData; | ||||||
|  | 			UECFG1XTemp = UECFG1XData; | ||||||
|  | 			UEIENXTemp  = 0; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			UECFG0XTemp = UECFG0X; | ||||||
|  | 			UECFG1XTemp = UECFG1X; | ||||||
|  | 			UEIENXTemp  = UEIENX; | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 	for (uint8_t EPNum = 1; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) | 		if (!(UECFG1XTemp & (1 << ALLOC))) | ||||||
| 	{ |  | ||||||
| 		Endpoint_SelectEndpoint(EPNum);	 |  | ||||||
| 		UEIENX  = 0; |  | ||||||
| 		UEINTX  = 0; |  | ||||||
| 		UECFG1X = 0; |  | ||||||
| 		Endpoint_DisableEndpoint(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) |  | ||||||
| 	{ |  | ||||||
| 		if (!(UECFG1XTemp[EPNum] & (1 << ALLOC))) |  | ||||||
| 		  continue; | 		  continue; | ||||||
| 
 | 
 | ||||||
| 		Endpoint_SelectEndpoint(EPNum);		 | 		Endpoint_DisableEndpoint(); | ||||||
| 		Endpoint_EnableEndpoint(); | 		UECFG1X &= (1 << ALLOC); | ||||||
| 
 | 
 | ||||||
| 		UECFG0X = UECFG0XTemp[EPNum]; | 		Endpoint_EnableEndpoint(); | ||||||
| 		UECFG1X = UECFG1XTemp[EPNum]; | 		UECFG0X = UECFG0XTemp; | ||||||
| 		UEIENX  = UEIENXTemp[EPNum]; | 		UECFG1X = UECFG1XTemp; | ||||||
|  | 		UEIENX  = UEIENXTemp; | ||||||
| 			 | 			 | ||||||
| 		if (!(Endpoint_IsConfigured())) | 		if (!(Endpoint_IsConfigured())) | ||||||
| 		  return false;			 | 		  return false;			 | ||||||
|  | |||||||
| @ -57,54 +57,49 @@ bool Pipe_ConfigurePipe(const uint8_t Number, | |||||||
| 
 | 
 | ||||||
| 	return Pipe_IsConfigured(); | 	return Pipe_IsConfigured(); | ||||||
| #else	 | #else	 | ||||||
| 	uint8_t UPCFG0XTemp[PIPE_TOTAL_PIPES]; | 	for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) | ||||||
| 	uint8_t UPCFG1XTemp[PIPE_TOTAL_PIPES]; |  | ||||||
| 	uint8_t UPCFG2XTemp[PIPE_TOTAL_PIPES]; |  | ||||||
| 	uint8_t UPCONXTemp[PIPE_TOTAL_PIPES]; |  | ||||||
| 	uint8_t UPINRQXTemp[PIPE_TOTAL_PIPES]; |  | ||||||
| 	uint8_t UPIENXTemp[PIPE_TOTAL_PIPES]; |  | ||||||
| 	 |  | ||||||
| 	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) |  | ||||||
| 	{ | 	{ | ||||||
|  | 		uint8_t UPCFG0XTemp; | ||||||
|  | 		uint8_t UPCFG1XTemp; | ||||||
|  | 		uint8_t UPCFG2XTemp; | ||||||
|  | 		uint8_t UPCONXTemp; | ||||||
|  | 		uint8_t UPINRQXTemp; | ||||||
|  | 		uint8_t UPIENXTemp; | ||||||
|  | 
 | ||||||
| 		Pipe_SelectPipe(PNum); | 		Pipe_SelectPipe(PNum); | ||||||
| 		UPCFG0XTemp[PNum] = UPCFG0X; |  | ||||||
| 		UPCFG1XTemp[PNum] = UPCFG1X; |  | ||||||
| 		UPCFG2XTemp[PNum] = UPCFG2X; |  | ||||||
| 		UPCONXTemp[PNum]  = UPCONX; |  | ||||||
| 		UPINRQXTemp[PNum] = UPINRQX; |  | ||||||
| 		UPIENXTemp[PNum]  = UPIENX; |  | ||||||
| 	} |  | ||||||
| 		 | 		 | ||||||
| 	UPCFG0XTemp[Number] = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); | 		if (PNum == Number) | ||||||
| 	UPCFG1XTemp[Number] = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); | 		{ | ||||||
| 	UPCFG2XTemp[Number] = 0; | 			UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); | ||||||
| 	UPCONXTemp[Number]  = (1 << INMODE); | 			UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); | ||||||
| 	UPINRQXTemp[Number] = 0; | 			UPCFG2XTemp = 0; | ||||||
| 	UPIENXTemp[Number]  = 0; | 			UPCONXTemp  = ((1 << PEN) | (1 << INMODE)); | ||||||
|  | 			UPINRQXTemp = 0; | ||||||
|  | 			UPIENXTemp  = 0; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			UPCFG0XTemp = UPCFG0X; | ||||||
|  | 			UPCFG1XTemp = UPCFG1X; | ||||||
|  | 			UPCFG2XTemp = UPCFG2X; | ||||||
|  | 			UPCONXTemp  = UPCONX; | ||||||
|  | 			UPINRQXTemp = UPINRQX; | ||||||
|  | 			UPIENXTemp  = UPIENX; | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) | 		if (!(UPCFG1XTemp & (1 << ALLOC))) | ||||||
| 	{ |  | ||||||
| 		Pipe_SelectPipe(PNum); |  | ||||||
| 		UPIENX  = 0; |  | ||||||
| 		UPINTX  = 0; |  | ||||||
| 		UPCFG1X = 0; |  | ||||||
| 		Pipe_DisablePipe(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) |  | ||||||
| 	{ |  | ||||||
| 		if (!(UPCFG1XTemp[PNum] & (1 << ALLOC))) |  | ||||||
| 		  continue; | 		  continue; | ||||||
| 		   | 		   | ||||||
| 		Pipe_SelectPipe(PNum);		 | 		Pipe_DisablePipe(); | ||||||
| 		Pipe_EnablePipe(); | 		UPCFG1X &= (1 << ALLOC); | ||||||
| 
 | 
 | ||||||
| 		UPCFG0X  = UPCFG0XTemp[PNum]; | 		Pipe_EnablePipe(); | ||||||
| 		UPCFG1X  = UPCFG1XTemp[PNum]; | 		UPCFG0X = UPCFG0XTemp; | ||||||
| 		UPCFG2X  = UPCFG2XTemp[PNum]; | 		UPCFG1X = UPCFG1XTemp; | ||||||
| 		UPCONX  |= UPCONXTemp[PNum]; | 		UPCFG2X = UPCFG2XTemp; | ||||||
| 		UPINRQX  = UPINRQXTemp[PNum]; | 		UPCONX  = UPCONXTemp; | ||||||
| 		UPIENX   = UPIENXTemp[PNum]; | 		UPINRQX = UPINRQXTemp; | ||||||
|  | 		UPIENX  = UPIENXTemp; | ||||||
| 
 | 
 | ||||||
| 		if (!(Pipe_IsConfigured())) | 		if (!(Pipe_IsConfigured())) | ||||||
| 		  return false;		 | 		  return false;		 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera