Added new EVENT_CDC_Device_BreakSent() event and CDC_Host_SendBreak() function to the Device and Host CDC Class drivers.
This commit is contained in:
		
							parent
							
								
									9c8bd6ed9b
								
							
						
					
					
						commit
						842e219bf3
					
				
					 6 changed files with 57 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -74,6 +74,15 @@
 | 
			
		|||
 | 
			
		||||
		/** CDC Class specific request to set the current virtual serial port handshake line states. */
 | 
			
		||||
		#define REQ_SetControlLineState          0x22
 | 
			
		||||
 | 
			
		||||
		/** CDC Class specific request to send a break to the receiver via the carrier channel. */
 | 
			
		||||
		#define REQ_SendBreak                    0x23
 | 
			
		||||
 | 
			
		||||
		/** CDC Class specific request to send an encapsulated command to the device. */
 | 
			
		||||
		#define REQ_SendEncapsulatedCommand      0x00
 | 
			
		||||
 | 
			
		||||
		/** CDC Class specific request to retrieve an encapsulated command response from the device. */
 | 
			
		||||
		#define REQ_GetEncapsulatedResponse      0x01
 | 
			
		||||
		
 | 
			
		||||
		/** Notification type constant for a change in the virtual serial port handshake line states, for
 | 
			
		||||
		 *  use with a USB_Notification_Header_t notification structure when sent to the host via the CDC 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,6 +83,17 @@ void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* CDCInterfaceIn
 | 
			
		|||
				Endpoint_ClearStatusStage();
 | 
			
		||||
			}
 | 
			
		||||
	
 | 
			
		||||
			break;
 | 
			
		||||
		case REQ_SendBreak:
 | 
			
		||||
			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 | 
			
		||||
			{				
 | 
			
		||||
				Endpoint_ClearSETUP();
 | 
			
		||||
				
 | 
			
		||||
				EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue);
 | 
			
		||||
 | 
			
		||||
				Endpoint_ClearStatusStage();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -190,6 +190,14 @@
 | 
			
		|||
			 */
 | 
			
		||||
			void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** CDC class driver event for a send break request sent to the device from the host. This is generally used to seperate
 | 
			
		||||
			 *  data or to indicate a special condition to the receiving device.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state
 | 
			
		||||
			 *  \param[in]     Duration          Duration of the break that has been sent by the host, in milliseconds
 | 
			
		||||
			 */
 | 
			
		||||
			void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, uint8_t Duration) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** Sends a given string to the attached USB host, if connected. If a host is not connected when the function is called, the
 | 
			
		||||
			 *  string is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the
 | 
			
		||||
			 *  \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be 
 | 
			
		||||
| 
						 | 
				
			
			@ -307,6 +315,8 @@
 | 
			
		|||
														  ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub);
 | 
			
		||||
				void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 | 
			
		||||
															 ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub);
 | 
			
		||||
				void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, uint8_t Duration)
 | 
			
		||||
				                                ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub);
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
	#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -261,6 +261,22 @@ uint8_t CDC_Host_SendControlLineStateChange(USB_ClassInfo_CDC_Host_t* const CDCI
 | 
			
		|||
	return USB_Host_SendControlRequest(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t CDC_Host_SendBreak(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, const uint8_t Duration)
 | 
			
		||||
{
 | 
			
		||||
	USB_ControlRequest = (USB_Request_Header_t)
 | 
			
		||||
	{
 | 
			
		||||
		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
 | 
			
		||||
		.bRequest      = REQ_SendBreak,
 | 
			
		||||
		.wValue        = Duration,
 | 
			
		||||
		.wIndex        = CDCInterfaceInfo->State.ControlInterfaceNumber,
 | 
			
		||||
		.wLength       = 0,
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	Pipe_SelectPipe(PIPE_CONTROLPIPE);
 | 
			
		||||
	
 | 
			
		||||
	return USB_Host_SendControlRequest(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, char* Data, const uint16_t Length)
 | 
			
		||||
{
 | 
			
		||||
	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
 | 
			
		||||
| 
						 | 
				
			
			@ -303,8 +319,6 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, cons
 | 
			
		|||
 | 
			
		||||
uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
 | 
			
		||||
{
 | 
			
		||||
	uint16_t BytesInPipe = 0;
 | 
			
		||||
 | 
			
		||||
	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
 | 
			
		||||
	  return 0;
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -190,6 +190,16 @@
 | 
			
		|||
			 */
 | 
			
		||||
			uint8_t CDC_Host_SendControlLineStateChange(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			
 | 
			
		||||
			/** Sends a Send Break request to the device. This is generally used to seperate data data or to indicate a special condition
 | 
			
		||||
			 *  to the receiving device.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state
 | 
			
		||||
			 *  \param[in]     Duration          Duration of the break, in milliseconds
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t CDC_Host_SendBreak(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, const uint8_t Duration) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			
 | 
			
		||||
			/** Sends a given string to the attached USB device, if connected. If a device is not connected when the function is called, the
 | 
			
		||||
			 *  string is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the
 | 
			
		||||
			 *  \ref CDC_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,7 @@
 | 
			
		|||
  *  - Added new ATTR_NO_INIT variable attribute for global variables that should not be automatically cleared on startup
 | 
			
		||||
  *  - Added new ENDPOINT_*_BusSuspended error code to the Endpoint function, so that the stream functions early-abort if the bus
 | 
			
		||||
  *    is suspended before or during a transfer
 | 
			
		||||
  *  - Added new EVENT_CDC_Device_BreakSent() event and CDC_Host_SendBreak() function to the Device and Host CDC Class drivers
 | 
			
		||||
  *
 | 
			
		||||
  *  <b>Changed:</b>
 | 
			
		||||
  *  - AVRISP programmer project now has a more robust timeout system
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue