@ -41,17 +41,19 @@ bool USB_CurrentlySelfPowered;
void USB_Device_ProcessControlPacket ( void )
{
uint8_t bmRequestType = Endpoint_Read_Byte ( ) ;
uint8_t bRequest = Endpoint_Read_Byte ( ) ;
bool RequestHandled = false ;
bool RequestHandled = false ;
uint8_t * RequestHeader = ( uint8_t * ) & USB_ControlRequest ;
switch ( bRequest )
for ( uint8_t RequestHeaderByte = 0 ; RequestHeaderByte < sizeof ( USB_Request_Header_t ) ; RequestHeaderByte + + )
* ( RequestHeader + + ) = Endpoint_Read_Byte ( ) ;
switch ( USB_ControlRequest . bRequest )
{
case REQ_GetStatus :
if ( ( bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE ) ) | |
( bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT ) ) )
if ( ( USB_ControlRequest. bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE ) ) | |
( USB_ControlRequest. bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT ) ) )
{
USB_Device_GetStatus ( bmRequestType ) ;
USB_Device_GetStatus ( ) ;
RequestHandled = true ;
}
@ -59,16 +61,16 @@ void USB_Device_ProcessControlPacket(void)
# if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)
case REQ_ClearFeature :
case REQ_SetFeature :
if ( bmRequestType = = ( REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT ) )
if ( USB_ControlRequest. bmRequestType = = ( REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT ) )
{
USB_Device_ClearSetFeature ( bRequest , bmRequestType ) ;
USB_Device_ClearSetFeature ( ) ;
RequestHandled = true ;
}
break ;
# endif
case REQ_SetAddress :
if ( bmRequestType = = ( REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE ) )
if ( USB_ControlRequest. bmRequestType = = ( REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE ) )
{
USB_Device_SetAddress ( ) ;
RequestHandled = true ;
@ -76,8 +78,8 @@ void USB_Device_ProcessControlPacket(void)
break ;
case REQ_GetDescriptor :
if ( ( bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE ) ) | |
( bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE ) ) )
if ( ( USB_ControlRequest. bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE ) ) | |
( USB_ControlRequest. bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE ) ) )
{
USB_Device_GetDescriptor ( ) ;
RequestHandled = true ;
@ -85,7 +87,7 @@ void USB_Device_ProcessControlPacket(void)
break ;
case REQ_GetConfiguration :
if ( bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE ) )
if ( USB_ControlRequest. bmRequestType = = ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE ) )
{
USB_Device_GetConfiguration ( ) ;
RequestHandled = true ;
@ -93,7 +95,7 @@ void USB_Device_ProcessControlPacket(void)
break ;
case REQ_SetConfiguration :
if ( bmRequestType = = ( REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE ) )
if ( USB_ControlRequest. bmRequestType = = ( REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE ) )
{
USB_Device_SetConfiguration ( ) ;
RequestHandled = true ;
@ -103,7 +105,7 @@ void USB_Device_ProcessControlPacket(void)
}
if ( ! ( RequestHandled ) )
RAISE_EVENT ( USB_UnhandledControlPacket , bRequest , bmRequestType );
RAISE_EVENT ( USB_UnhandledControlPacket );
if ( Endpoint_IsSETUPReceived ( ) )
{
@ -114,8 +116,6 @@ void USB_Device_ProcessControlPacket(void)
static void USB_Device_SetAddress ( void )
{
uint8_t wValue_LSB = Endpoint_Read_Byte ( ) ;
Endpoint_ClearSETUP ( ) ;
while ( ! ( Endpoint_IsINReady ( ) ) ) ;
@ -124,28 +124,27 @@ static void USB_Device_SetAddress(void)
while ( ! ( Endpoint_IsINReady ( ) ) ) ;
UDADDR = ( ( 1 < < ADDEN ) | ( wValue_LSB & 0x7F ) ) ;
UDADDR = ( ( 1 < < ADDEN ) | ( USB_ControlRequest. wValue & 0x7F ) ) ;
return ;
}
static void USB_Device_SetConfiguration ( void )
{
uint8_t wValue_LSB = Endpoint_Read_Byte ( ) ;
bool AlreadyConfigured = ( USB_ConfigurationNumber ! = 0 ) ;
# if defined(USE_SINGLE_DEVICE_CONFIGURATION)
if ( wValue_LSB > 1 )
if ( USB_ControlRequest. wValue > 1 )
# else
USB_Descriptor_Device_t * DevDescriptorPtr ;
if ( ( USB_GetDescriptor ( ( DTYPE_Device < < 8 ) , 0 , ( void * ) & DevDescriptorPtr ) = = NO_DESCRIPTOR ) | |
# if defined(USE_RAM_DESCRIPTORS)
( wValue_LSB > DevDescriptorPtr - > NumberOfConfigurations ) )
( USB_ControlRequest. wValue > DevDescriptorPtr - > NumberOfConfigurations ) )
# elif defined (USE_EEPROM_DESCRIPTORS)
( wValue_LSB > eeprom_read_byte ( & DevDescriptorPtr - > NumberOfConfigurations ) ) )
( USB_ControlRequest. wValue > eeprom_read_byte ( & DevDescriptorPtr - > NumberOfConfigurations ) ) )
# else
( wValue_LSB > pgm_read_byte ( & DevDescriptorPtr - > NumberOfConfigurations ) ) )
( USB_ControlRequest. wValue > pgm_read_byte ( & DevDescriptorPtr - > NumberOfConfigurations ) ) )
# endif
# endif
{
@ -154,7 +153,7 @@ static void USB_Device_SetConfiguration(void)
Endpoint_ClearSETUP ( ) ;
USB_ConfigurationNumber = wValue_LSB ;
USB_ConfigurationNumber = USB_ControlRequest. wValue;
Endpoint_ClearIN ( ) ;
@ -178,24 +177,23 @@ void USB_Device_GetConfiguration(void)
static void USB_Device_GetDescriptor ( void )
{
uint16_t wValue = Endpoint_Read_Word_LE ( ) ;
uint16_t wIndex = Endpoint_Read_Word_LE ( ) ;
uint16_t wLength = Endpoint_Read_Word_LE ( ) ;
void * DescriptorPointer ;
uint16_t DescriptorSize ;
bool SendZLP ;
if ( ( DescriptorSize = USB_GetDescriptor ( wValue , wIndex , & DescriptorPointer ) ) = = NO_DESCRIPTOR )
if ( ( DescriptorSize = USB_GetDescriptor ( USB_ControlRequest . wValue , USB_ControlRequest . wIndex , & DescriptorPointer ) ) = = NO_DESCRIPTOR )
return ;
Endpoint_ClearSETUP ( ) ;
Endpoint_ClearSETUP ( ) ;
# if defined(USE_RAM_DESCRIPTORS)
Endpoint_Write_Control_Stream_LE ( DescriptorPointer , DescriptorSize ) ;
# else
bool SendZLP ;
if ( wLength > DescriptorSize )
wLength = DescriptorSize ;
if ( USB_ControlRequest. wLength > DescriptorSize )
USB_ControlRequest. wLength = DescriptorSize ;
while ( wLength )
while ( USB_ControlRequest. wLength)
{
while ( ! ( Endpoint_IsINReady ( ) ) )
{
@ -206,17 +204,15 @@ static void USB_Device_GetDescriptor(void)
}
}
while ( wLength & & ( Endpoint_BytesInEndpoint ( ) < USB_ControlEndpointSize ) )
while ( USB_ControlRequest. wLength & & ( Endpoint_BytesInEndpoint ( ) < USB_ControlEndpointSize ) )
{
# if defined(USE_RAM_DESCRIPTORS)
Endpoint_Write_Byte ( * ( ( uint8_t * ) DescriptorPointer + + ) ) ;
# elif defined (USE_EEPROM_DESCRIPTORS)
# if defined (USE_EEPROM_DESCRIPTORS)
Endpoint_Write_Byte ( eeprom_read_byte ( DescriptorPointer + + ) ) ;
# else
Endpoint_Write_Byte ( pgm_read_byte ( DescriptorPointer + + ) ) ;
# endif
wLength- - ;
USB_ControlRequest. wLength- - ;
}
SendZLP = ( Endpoint_BytesInEndpoint ( ) = = USB_ControlEndpointSize ) ;
@ -230,20 +226,16 @@ static void USB_Device_GetDescriptor(void)
}
while ( ! ( Endpoint_IsOUTReceived ( ) ) ) ;
# endif
Endpoint_ClearOUT ( ) ;
}
static void USB_Device_GetStatus ( const uint8_t bmRequestType )
static void USB_Device_GetStatus ( void )
{
uint8_t CurrentStatus = 0 ;
Endpoint_Discard_Word ( ) ;
# if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)
uint8_t wIndex_LSB = Endpoint_Read_Byte ( ) ;
# endif
switch ( bmRequestType )
switch ( USB_ControlRequest . bmRequestType )
{
case ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE ) :
if ( USB_CurrentlySelfPowered )
@ -255,15 +247,16 @@ static void USB_Device_GetStatus(const uint8_t bmRequestType)
break ;
# if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)
case ( REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT ) :
Endpoint_SelectEndpoint ( wIndex_LSB ) ;
Endpoint_SelectEndpoint ( USB_ControlRequest. wIndex) ;
CurrentStatus = Endpoint_IsStalled ( ) ;
Endpoint_SelectEndpoint ( ENDPOINT_CONTROLEP ) ;
break ;
# endif
}
Endpoint_SelectEndpoint ( ENDPOINT_CONTROLEP ) ;
Endpoint_ClearSETUP ( ) ;
Endpoint_Write_Word_LE ( CurrentStatus ) ;
@ -275,17 +268,14 @@ static void USB_Device_GetStatus(const uint8_t bmRequestType)
}
# if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)
static void USB_Device_ClearSetFeature ( const uint8_t bRequest , const uint8_t bmRequestType )
{
uint16_t wValue = Endpoint_Read_Word_LE ( ) ;
uint16_t wIndex = Endpoint_Read_Word_LE ( ) ;
switch ( bmRequestType & CONTROL_REQTYPE_RECIPIENT )
static void USB_Device_ClearSetFeature ( void )
{
switch ( USB_ControlRequest . bmRequestType & CONTROL_REQTYPE_RECIPIENT )
{
case REQREC_ENDPOINT :
if ( wValue = = FEATURE_ENDPOINT_HALT )
if ( USB_ControlRequest . wValue = = FEATURE_ENDPOINT_HALT )
{
uint8_t EndpointIndex = ( wIndex & ENDPOINT_EPNUM_MASK ) ;
uint8_t EndpointIndex = ( USB_ControlRequest. wIndex & ENDPOINT_EPNUM_MASK ) ;
if ( EndpointIndex ! = ENDPOINT_CONTROLEP )
{
@ -293,7 +283,7 @@ static void USB_Device_ClearSetFeature(const uint8_t bRequest, const uint8_t bmR
if ( Endpoint_IsEnabled ( ) )
{
if ( bRequest = = REQ_ClearFeature )
if ( USB_ControlRequest. bRequest = = REQ_ClearFeature )
{
Endpoint_ClearStall ( ) ;
Endpoint_ResetFIFO ( EndpointIndex ) ;