Fixed Mouse and Keyboard device demos not acting in accordance with the HID specification for idle periods (thanks to Brian Dickman).
Removed support for endpoint/pipe non-control interrupts; these did not act in the way users expected, and had many subtle issues.
This commit is contained in:
		
							parent
							
								
									ea74397095
								
							
						
					
					
						commit
						958a1b4e2b
					
				
					 23 changed files with 98 additions and 470 deletions
				
			
		|  | @ -182,10 +182,8 @@ void ReadNextReport(void) | |||
| 	/* Check to see if a packet has been received */ | ||||
| 	if (!(Pipe_IsINReceived())) | ||||
| 	{ | ||||
| 		#if !defined(INTERRUPT_DATA_PIPE) | ||||
| 		/* Refreeze HID data IN pipe */ | ||||
| 		Pipe_Freeze(); | ||||
| 		#endif | ||||
| 			 | ||||
| 		return; | ||||
| 	} | ||||
|  | @ -208,10 +206,8 @@ void ReadNextReport(void) | |||
| 	/* Clear the IN endpoint, ready for next data packet */ | ||||
| 	Pipe_ClearIN(); | ||||
| 	 | ||||
| 	#if !defined(INTERRUPT_DATA_PIPE) | ||||
| 	/* Refreeze HID data IN pipe */ | ||||
| 	Pipe_Freeze(); | ||||
| 	#endif | ||||
| } | ||||
| 
 | ||||
| /** Writes a report to the attached device.
 | ||||
|  | @ -345,43 +341,9 @@ TASK(USB_HID_Host) | |||
| 					 | ||||
| 			USB_HostState = HOST_STATE_Ready; | ||||
| 			break; | ||||
| 		#if !defined(INTERRUPT_DATA_PIPE) | ||||
| 		case HOST_STATE_Ready: | ||||
| 			ReadNextReport(); | ||||
| 
 | ||||
| 			break; | ||||
| 		#endif | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #if defined(INTERRUPT_DATA_PIPE) | ||||
| /** Interrupt handler for the Endpoint/Pipe interrupt vector. This interrupt fires each time an enabled
 | ||||
|  *  pipe interrupt occurs on a pipe which has had that interrupt enabled. | ||||
|  */ | ||||
| ISR(ENDPOINT_PIPE_vect, ISR_BLOCK) | ||||
| { | ||||
| 	/* Save previously selected pipe before selecting a new pipe */ | ||||
| 	uint8_t PrevSelectedPipe = Pipe_GetCurrentPipe(); | ||||
| 
 | ||||
| 	/* Check to see if the HID data IN pipe has caused the interrupt */ | ||||
| 	if (Pipe_HasPipeInterrupted(HID_DATA_IN_PIPE)) | ||||
| 	{ | ||||
| 		/* Clear the pipe interrupt, and select the data IN pipe */ | ||||
| 		Pipe_ClearPipeInterrupt(HID_DATA_IN_PIPE); | ||||
| 		Pipe_SelectPipe(HID_DATA_IN_PIPE);	 | ||||
| 
 | ||||
| 		/* Check to see if the pipe IN interrupt has fired */ | ||||
| 		if (USB_INT_HasOccurred(PIPE_INT_IN) && USB_INT_IsEnabled(PIPE_INT_IN)) | ||||
| 		{ | ||||
| 			/* Clear interrupt flag */ | ||||
| 			USB_INT_Clear(PIPE_INT_IN);		 | ||||
| 
 | ||||
| 			/* Read and process the next report from the device */ | ||||
| 			ReadNextReport(); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Restore previously selected pipe */ | ||||
| 	Pipe_SelectPipe(PrevSelectedPipe); | ||||
| } | ||||
| #endif | ||||
|  |  | |||
|  | @ -47,16 +47,9 @@ | |||
|  * | ||||
|  *  <table> | ||||
|  *   <tr> | ||||
|  *    <td><b>Define Name:</b></td> | ||||
|  *    <td><b>Location:</b></td> | ||||
|  *    <td><b>Description:</b></td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>INTERRUPT_DATA_ENDPOINT</td> | ||||
|  *    <td>Makefile CDEFS</td> | ||||
|  *    <td>When defined, this causes the demo to enable interrupts for the data IN pipe, | ||||
|  *        which services reports from the device. If not defined, the data pipe is | ||||
|  *        serviced via polling using the task scheduler.</td> | ||||
|  *    <td> | ||||
|  *     None | ||||
|  *    </td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dean Camera
						Dean Camera