Added new EVENT_USB_Device_StartOfFrame() event, controlled by the new USB_Device_EnableSOFEvents() and USB_Device_DisableSOFEvents() macros to give bus-synchronised millisecond interrupts when in USB device mode.
This commit is contained in:
		
							parent
							
								
									25ddbb9e3b
								
							
						
					
					
						commit
						b71ff7c8cd
					
				
					 23 changed files with 83 additions and 75 deletions
				
			
		| 
						 | 
				
			
			@ -119,7 +119,9 @@
 | 
			
		|||
			void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo);
 | 
			
		||||
			
 | 
			
		||||
			/** Indicates that a millisecond of idle time has elapsed on the given HID interface, and the interface's idle count should be
 | 
			
		||||
			 *  decremented. This should be called once per millisecond so that hardware key-repeats function correctly.
 | 
			
		||||
			 *  decremented. This should be called once per millisecond so that hardware key-repeats function correctly. It is recommended
 | 
			
		||||
			 *  that this be called by the \ref EVENT_USB_Device_StartOfFrame() event, once SOF events have been enabled via
 | 
			
		||||
			 *  \ref USB_Device_EnableSOFEvents();.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
 | 
			
		||||
			 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -234,6 +234,18 @@
 | 
			
		|||
			 *        \ref Group_USBManagement documentation).
 | 
			
		||||
			 */
 | 
			
		||||
			void EVENT_USB_Device_Reset(void);
 | 
			
		||||
 | 
			
		||||
			/** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
 | 
			
		||||
			 *  frame, once per millisecond, and is synchronised to the USB bus. This can be used as an accurate
 | 
			
		||||
			 *  millisecond timer source when the USB bus is enumerated in device mode to a USB host.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  This event is not normally active - it must be manually enabled and disabled via the
 | 
			
		||||
			 *  \ref USB_Device_EnableSOFEvents() and \ref USB_Device_DisableSOFEvents() commands after enumeration.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This event does not exist if the USB_HOST_ONLY token is supplied to the compiler (see
 | 
			
		||||
			 *        \ref Group_USBManagement documentation).
 | 
			
		||||
			 */
 | 
			
		||||
			void EVENT_USB_Device_StartOfFrame(void);
 | 
			
		||||
		#endif
 | 
			
		||||
		
 | 
			
		||||
	/* Private Interface - For use in library only: */
 | 
			
		||||
| 
						 | 
				
			
			@ -264,6 +276,7 @@
 | 
			
		|||
					void EVENT_USB_Device_Suspend(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
 | 
			
		||||
					void EVENT_USB_Device_WakeUp(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
 | 
			
		||||
					void EVENT_USB_Device_Reset(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
 | 
			
		||||
					void EVENT_USB_Device_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
 | 
			
		||||
				#endif
 | 
			
		||||
			#endif
 | 
			
		||||
	#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -153,6 +153,13 @@ ISR(USB_GEN_vect, ISR_BLOCK)
 | 
			
		|||
 | 
			
		||||
		EVENT_USB_Device_Reset();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))
 | 
			
		||||
	{
 | 
			
		||||
		USB_INT_Clear(USB_INT_SOFI);
 | 
			
		||||
		
 | 
			
		||||
		EVENT_USB_Device_StartOfFrame();
 | 
			
		||||
	}
 | 
			
		||||
	#endif
 | 
			
		||||
	
 | 
			
		||||
	#if defined(USB_CAN_BE_HOST)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,12 +111,27 @@
 | 
			
		|||
				 *  \return Boolean true if the USB communications have been suspended by the host, false otherwise.
 | 
			
		||||
				 */
 | 
			
		||||
				static inline bool USB_Device_IsUSBSuspended(void);
 | 
			
		||||
				
 | 
			
		||||
				/** Enables the device mode Start Of Frame events. When enabled, this causes the
 | 
			
		||||
				 *  \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronised to the USB bus,
 | 
			
		||||
				 *  at the start of each USB frame when enumerated in device mode.
 | 
			
		||||
				 */
 | 
			
		||||
				static inline bool USB_Device_EnableSOFEvents(void);
 | 
			
		||||
				
 | 
			
		||||
				/** Disables the device mode Start Of Frame events. When disabled, this stop the firing of the
 | 
			
		||||
				 *  \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
 | 
			
		||||
				 */
 | 
			
		||||
				static inline bool USB_Device_DisableSOFEvents(void);
 | 
			
		||||
			#else
 | 
			
		||||
				#define USB_Device_SendRemoteWakeup()   MACROS{ UDCON |= (1 << RMWKUP); }MACROE
 | 
			
		||||
 | 
			
		||||
				#define USB_Device_IsRemoteWakeupSent()       ((UDCON &  (1 << RMWKUP)) ? false : true)
 | 
			
		||||
 | 
			
		||||
				#define USB_Device_IsUSBSuspended()           ((UDINT &  (1 << SUSPI)) ? true : false)
 | 
			
		||||
				
 | 
			
		||||
				#define USB_Device_EnableSOFEvents()    MACROS{ USB_INT_Enable(USB_INT_SOFI); }MACROE
 | 
			
		||||
 | 
			
		||||
				#define USB_Device_DisableSOFEvents()   MACROS{ USB_INT_Disable(USB_INT_SOFI); }MACROE
 | 
			
		||||
			#endif
 | 
			
		||||
			
 | 
			
		||||
		/* Type Defines: */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue