mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Fixed race conditions in the CDC, HID and Mass Storage class drivers when processing some control requests.
This commit is contained in:
		
							parent
							
								
									2b54cd984d
								
							
						
					
					
						commit
						8df0cf3241
					
				| @ -26,6 +26,7 @@ | |||||||
|   *  - Core: |   *  - Core: | ||||||
|   *   - Fixed ring buffer size limited to 255 elements, instead of the intended 65535 elements. |   *   - Fixed ring buffer size limited to 255 elements, instead of the intended 65535 elements. | ||||||
|   *   - Fixed CDC class drivers not saving and sending all 16-bits of the control line states (thanks to Matthew Swabey) |   *   - Fixed CDC class drivers not saving and sending all 16-bits of the control line states (thanks to Matthew Swabey) | ||||||
|  |   *   - Fixed race conditions in the CDC, HID and Mass Storage class drivers when processing some control requests | ||||||
|   *  - Library Applications: |   *  - Library Applications: | ||||||
|   *   - Added reliability patches to the AVRISP-MKII Clone project's PDI/TPI protocols (thanks to Justin Mattair) |   *   - Added reliability patches to the AVRISP-MKII Clone project's PDI/TPI protocols (thanks to Justin Mattair) | ||||||
|   *   - Fixed AVRISP-MKII Clone compile warning on AVR8 U4 targets even when NO_VTARGET_DETECT is enabled |   *   - Fixed AVRISP-MKII Clone compile warning on AVR8 U4 targets even when NO_VTARGET_DETECT is enabled | ||||||
|  | |||||||
| @ -136,6 +136,10 @@ | |||||||
|  *  - Elektor Magazine, "20 x Open Source" by Jens Nickel, March 2010 Issue |  *  - Elektor Magazine, "20 x Open Source" by Jens Nickel, March 2010 Issue | ||||||
|  *  - Circuit Cellar Magazine, "Advanced USB Design Debugging" by Collin O'Flynn, August 2010 Issue |  *  - Circuit Cellar Magazine, "Advanced USB Design Debugging" by Collin O'Flynn, August 2010 Issue | ||||||
|  * |  * | ||||||
|  |  *  \section Sec_PortsAndForks Non-Official LUFA Ports and Forks | ||||||
|  |  *  - NXP's official "nxpusblib" LUFA fork, for LPC devices: http://www.lpcware.com/content/project/nxpusblib | ||||||
|  |  *  - Kevin Mehall's LUFA port to the NXP LPC13xx: https://github.com/kevinmehall/LUFA-LPC13xx | ||||||
|  |  * | ||||||
|  *  \section Sec_LUFANotableMentions Other Notable Mentions of LUFA |  *  \section Sec_LUFANotableMentions Other Notable Mentions of LUFA | ||||||
|  *  - Adafruit "Ask an Engineer", 7th November 2010 |  *  - Adafruit "Ask an Engineer", 7th November 2010 | ||||||
|  *  - Arduino 2010 Keynote speech |  *  - Arduino 2010 Keynote speech | ||||||
|  | |||||||
| @ -51,10 +51,14 @@ void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInter | |||||||
| 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) | 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) | ||||||
| 			{ | 			{ | ||||||
| 				Endpoint_ClearSETUP(); | 				Endpoint_ClearSETUP(); | ||||||
|  | 
 | ||||||
|  | 				while (!(Endpoint_IsINReady())); | ||||||
|  | 
 | ||||||
| 				Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); | 				Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); | ||||||
| 				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); | 				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); | ||||||
| 				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); | 				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); | ||||||
| 				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); | 				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); | ||||||
|  | 
 | ||||||
| 				Endpoint_ClearIN(); | 				Endpoint_ClearIN(); | ||||||
| 				Endpoint_ClearStatusStage(); | 				Endpoint_ClearStatusStage(); | ||||||
| 			} | 			} | ||||||
| @ -64,10 +68,14 @@ void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInter | |||||||
| 			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) | 			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) | ||||||
| 			{ | 			{ | ||||||
| 				Endpoint_ClearSETUP(); | 				Endpoint_ClearSETUP(); | ||||||
|  | 
 | ||||||
|  | 				while (!(Endpoint_IsOUTReceived())); | ||||||
|  | 
 | ||||||
| 				CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); | 				CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); | ||||||
| 				CDCInterfaceInfo->State.LineEncoding.CharFormat  = Endpoint_Read_8(); | 				CDCInterfaceInfo->State.LineEncoding.CharFormat  = Endpoint_Read_8(); | ||||||
| 				CDCInterfaceInfo->State.LineEncoding.ParityType  = Endpoint_Read_8(); | 				CDCInterfaceInfo->State.LineEncoding.ParityType  = Endpoint_Read_8(); | ||||||
| 				CDCInterfaceInfo->State.LineEncoding.DataBits    = Endpoint_Read_8(); | 				CDCInterfaceInfo->State.LineEncoding.DataBits    = Endpoint_Read_8(); | ||||||
|  | 
 | ||||||
| 				Endpoint_ClearOUT(); | 				Endpoint_ClearOUT(); | ||||||
| 				Endpoint_ClearStatusStage(); | 				Endpoint_ClearStatusStage(); | ||||||
| 			 | 			 | ||||||
|  | |||||||
| @ -94,6 +94,7 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter | |||||||
| 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) | 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) | ||||||
| 			{ | 			{ | ||||||
| 				Endpoint_ClearSETUP(); | 				Endpoint_ClearSETUP(); | ||||||
|  | 				while (!(Endpoint_IsINReady())); | ||||||
| 				Endpoint_Write_8(HIDInterfaceInfo->State.UsingReportProtocol); | 				Endpoint_Write_8(HIDInterfaceInfo->State.UsingReportProtocol); | ||||||
| 				Endpoint_ClearIN(); | 				Endpoint_ClearIN(); | ||||||
| 				Endpoint_ClearStatusStage(); | 				Endpoint_ClearStatusStage(); | ||||||
| @ -124,6 +125,7 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter | |||||||
| 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) | 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) | ||||||
| 			{ | 			{ | ||||||
| 				Endpoint_ClearSETUP(); | 				Endpoint_ClearSETUP(); | ||||||
|  | 				while (!(Endpoint_IsINReady())); | ||||||
| 				Endpoint_Write_8(HIDInterfaceInfo->State.IdleCount >> 2); | 				Endpoint_Write_8(HIDInterfaceInfo->State.IdleCount >> 2); | ||||||
| 				Endpoint_ClearIN(); | 				Endpoint_ClearIN(); | ||||||
| 				Endpoint_ClearStatusStage(); | 				Endpoint_ClearStatusStage(); | ||||||
|  | |||||||
| @ -61,6 +61,7 @@ void MS_Device_ProcessControlRequest(USB_ClassInfo_MS_Device_t* const MSInterfac | |||||||
| 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) | 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) | ||||||
| 			{ | 			{ | ||||||
| 				Endpoint_ClearSETUP(); | 				Endpoint_ClearSETUP(); | ||||||
|  | 				while (!(Endpoint_IsINReady())); | ||||||
| 				Endpoint_Write_8(MSInterfaceInfo->Config.TotalLUNs - 1); | 				Endpoint_Write_8(MSInterfaceInfo->Config.TotalLUNs - 1); | ||||||
| 				Endpoint_ClearIN(); | 				Endpoint_ClearIN(); | ||||||
| 				Endpoint_ClearStatusStage(); | 				Endpoint_ClearStatusStage(); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera