3      Copyright (C) Dean Camera, 2015. 
   5   dean [at] fourwalledcubicle [dot] com 
  10   Copyright 2015  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, distribute, and sell this 
  13   software and its documentation for any purpose is hereby granted 
  14   without fee, provided that the above copyright notice appear in 
  15   all copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting 
  17   documentation, and that the name of the author not be used in 
  18   advertising or publicity pertaining to distribution of the 
  19   software without specific, written prior permission. 
  21   The author disclaims all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  31 #define  __INCLUDE_FROM_USB_DRIVER 
  34 #if defined(USB_CAN_BE_DEVICE) 
  36 #define  __INCLUDE_FROM_DEVICESTDREQ_C 
  37 #include "DeviceStandardReq.h" 
  39 uint8_t USB_Device_ConfigurationNumber
; 
  41 #if !defined(NO_DEVICE_SELF_POWER) 
  42 bool    USB_Device_CurrentlySelfPowered
; 
  45 #if !defined(NO_DEVICE_REMOTE_WAKEUP) 
  46 bool    USB_Device_RemoteWakeupEnabled
; 
  49 void USB_Device_ProcessControlRequest(void) 
  51         #if defined(ARCH_BIG_ENDIAN) 
  52         USB_ControlRequest
.bmRequestType 
= Endpoint_Read_8(); 
  53         USB_ControlRequest
.bRequest      
= Endpoint_Read_8(); 
  54         USB_ControlRequest
.wValue        
= Endpoint_Read_16_LE(); 
  55         USB_ControlRequest
.wIndex        
= Endpoint_Read_16_LE(); 
  56         USB_ControlRequest
.wLength       
= Endpoint_Read_16_LE(); 
  58         uint8_t* RequestHeader 
= (uint8_t*)&USB_ControlRequest
; 
  60         for (uint8_t RequestHeaderByte 
= 0; RequestHeaderByte 
< sizeof(USB_Request_Header_t
); RequestHeaderByte
++) 
  61           *(RequestHeader
++) = Endpoint_Read_8(); 
  64         EVENT_USB_Device_ControlRequest(); 
  66         if (Endpoint_IsSETUPReceived()) 
  68                 uint8_t bmRequestType 
= USB_ControlRequest
.bmRequestType
; 
  70                 switch (USB_ControlRequest
.bRequest
) 
  73                                 if ((bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) || 
  74                                         (bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_ENDPOINT
))) 
  76                                         USB_Device_GetStatus(); 
  80                         case REQ_ClearFeature
: 
  82                                 if ((bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) || 
  83                                         (bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_STANDARD 
| REQREC_ENDPOINT
))) 
  85                                         USB_Device_ClearSetFeature(); 
  90                                 if (bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) 
  91                                   USB_Device_SetAddress(); 
  94                         case REQ_GetDescriptor
: 
  95                                 if ((bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) || 
  96                                         (bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_INTERFACE
))) 
  98                                         USB_Device_GetDescriptor(); 
 102                         case REQ_GetConfiguration
: 
 103                                 if (bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) 
 104                                   USB_Device_GetConfiguration(); 
 107                         case REQ_SetConfiguration
: 
 108                                 if (bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) 
 109                                   USB_Device_SetConfiguration(); 
 118         if (Endpoint_IsSETUPReceived()) 
 120                 Endpoint_ClearSETUP(); 
 121                 Endpoint_StallTransaction(); 
 125 static void USB_Device_SetAddress(void) 
 127         uint8_t DeviceAddress 
= (USB_ControlRequest
.wValue 
& 0x7F); 
 129         USB_Device_SetDeviceAddress(DeviceAddress
); 
 131         Endpoint_ClearSETUP(); 
 133         Endpoint_ClearStatusStage(); 
 135         while (!(Endpoint_IsINReady())); 
 137         USB_Device_EnableDeviceAddress(DeviceAddress
); 
 139         USB_DeviceState 
= (DeviceAddress
) ? DEVICE_STATE_Addressed 
: DEVICE_STATE_Default
; 
 142 static void USB_Device_SetConfiguration(void) 
 144         #if defined(FIXED_NUM_CONFIGURATIONS) 
 145         if ((uint8_t)USB_ControlRequest
.wValue 
> FIXED_NUM_CONFIGURATIONS
) 
 148         USB_Descriptor_Device_t
* DevDescriptorPtr
; 
 150         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) 
 151                 #if defined(USE_FLASH_DESCRIPTORS) 
 152                         #define MemoryAddressSpace  MEMSPACE_FLASH 
 153                 #elif defined(USE_EEPROM_DESCRIPTORS) 
 154                         #define MemoryAddressSpace  MEMSPACE_EEPROM 
 155                 #elif defined(USE_RAM_DESCRIPTORS) 
 156                         #define MemoryAddressSpace  MEMSPACE_RAM 
 158                         uint8_t MemoryAddressSpace
; 
 162         if (CALLBACK_USB_GetDescriptor((DTYPE_Device 
<< 8), 0, (void*)&DevDescriptorPtr
 
 163         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ 
 164             !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) 
 165                                        , &MemoryAddressSpace
 
 172         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) 
 173         if (MemoryAddressSpace 
== MEMSPACE_FLASH
) 
 175                 if (((uint8_t)USB_ControlRequest
.wValue 
> pgm_read_byte(&DevDescriptorPtr
->NumberOfConfigurations
))) 
 178         else if (MemoryAddressSpace 
== MEMSPACE_EEPROM
) 
 180                 if (((uint8_t)USB_ControlRequest
.wValue 
> eeprom_read_byte(&DevDescriptorPtr
->NumberOfConfigurations
))) 
 185                 if ((uint8_t)USB_ControlRequest
.wValue 
> DevDescriptorPtr
->NumberOfConfigurations
) 
 189         if ((uint8_t)USB_ControlRequest
.wValue 
> DevDescriptorPtr
->NumberOfConfigurations
) 
 194         Endpoint_ClearSETUP(); 
 196         USB_Device_ConfigurationNumber 
= (uint8_t)USB_ControlRequest
.wValue
; 
 198         Endpoint_ClearStatusStage(); 
 200         if (USB_Device_ConfigurationNumber
) 
 201           USB_DeviceState 
= DEVICE_STATE_Configured
; 
 203           USB_DeviceState 
= (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured 
: DEVICE_STATE_Powered
; 
 205         EVENT_USB_Device_ConfigurationChanged(); 
 208 static void USB_Device_GetConfiguration(void) 
 210         Endpoint_ClearSETUP(); 
 212         Endpoint_Write_8(USB_Device_ConfigurationNumber
); 
 215         Endpoint_ClearStatusStage(); 
 218 #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) 
 219 static void USB_Device_GetInternalSerialDescriptor(void) 
 223                 USB_Descriptor_Header_t Header
; 
 224                 uint16_t                UnicodeString
[INTERNAL_SERIAL_LENGTH_BITS 
/ 4]; 
 225         } SignatureDescriptor
; 
 227         SignatureDescriptor
.Header
.Type 
= DTYPE_String
; 
 228         SignatureDescriptor
.Header
.Size 
= USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS 
/ 4); 
 230         USB_Device_GetSerialString(SignatureDescriptor
.UnicodeString
); 
 232         Endpoint_ClearSETUP(); 
 234         Endpoint_Write_Control_Stream_LE(&SignatureDescriptor
, sizeof(SignatureDescriptor
)); 
 239 static void USB_Device_GetDescriptor(void) 
 241         const void* DescriptorPointer
; 
 242         uint16_t    DescriptorSize
; 
 244         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ 
 245             !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) 
 246         uint8_t DescriptorAddressSpace
; 
 249         #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) 
 250         if (USB_ControlRequest
.wValue 
== ((DTYPE_String 
<< 8) | USE_INTERNAL_SERIAL
)) 
 252                 USB_Device_GetInternalSerialDescriptor(); 
 257         if ((DescriptorSize 
= CALLBACK_USB_GetDescriptor(USB_ControlRequest
.wValue
, USB_ControlRequest
.wIndex
, 
 259         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ 
 260             !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) 
 261                                                          , &DescriptorAddressSpace
 
 268         Endpoint_ClearSETUP(); 
 270         #if defined(USE_RAM_DESCRIPTORS) || !defined(ARCH_HAS_MULTI_ADDRESS_SPACE) 
 271         Endpoint_Write_Control_Stream_LE(DescriptorPointer
, DescriptorSize
); 
 272         #elif defined(USE_EEPROM_DESCRIPTORS) 
 273         Endpoint_Write_Control_EStream_LE(DescriptorPointer
, DescriptorSize
); 
 274         #elif defined(USE_FLASH_DESCRIPTORS) 
 275         Endpoint_Write_Control_PStream_LE(DescriptorPointer
, DescriptorSize
); 
 277         if (DescriptorAddressSpace 
== MEMSPACE_FLASH
) 
 278           Endpoint_Write_Control_PStream_LE(DescriptorPointer
, DescriptorSize
); 
 279         else if (DescriptorAddressSpace 
== MEMSPACE_EEPROM
) 
 280           Endpoint_Write_Control_EStream_LE(DescriptorPointer
, DescriptorSize
); 
 282           Endpoint_Write_Control_Stream_LE(DescriptorPointer
, DescriptorSize
); 
 288 static void USB_Device_GetStatus(void) 
 290         uint8_t CurrentStatus 
= 0; 
 292         switch (USB_ControlRequest
.bmRequestType
) 
 294                 case (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_DEVICE
): 
 295                         #if !defined(NO_DEVICE_SELF_POWER) 
 296                         if (USB_Device_CurrentlySelfPowered
) 
 297                           CurrentStatus 
|= FEATURE_SELFPOWERED_ENABLED
; 
 300                         #if !defined(NO_DEVICE_REMOTE_WAKEUP) 
 301                         if (USB_Device_RemoteWakeupEnabled
) 
 302                           CurrentStatus 
|= FEATURE_REMOTE_WAKEUP_ENABLED
; 
 305                 case (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_ENDPOINT
): 
 306                         #if !defined(CONTROL_ONLY_DEVICE) 
 307                         Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest
.wIndex 
& ENDPOINT_EPNUM_MASK
); 
 309                         CurrentStatus 
= Endpoint_IsStalled(); 
 311                         Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP
); 
 319         Endpoint_ClearSETUP(); 
 321         Endpoint_Write_16_LE(CurrentStatus
); 
 324         Endpoint_ClearStatusStage(); 
 327 static void USB_Device_ClearSetFeature(void) 
 329         switch (USB_ControlRequest
.bmRequestType 
& CONTROL_REQTYPE_RECIPIENT
) 
 331                 #if !defined(NO_DEVICE_REMOTE_WAKEUP) 
 333                         if ((uint8_t)USB_ControlRequest
.wValue 
== FEATURE_SEL_DeviceRemoteWakeup
) 
 334                           USB_Device_RemoteWakeupEnabled 
= (USB_ControlRequest
.bRequest 
== REQ_SetFeature
); 
 340                 #if !defined(CONTROL_ONLY_DEVICE) 
 341                 case REQREC_ENDPOINT
: 
 342                         if ((uint8_t)USB_ControlRequest
.wValue 
== FEATURE_SEL_EndpointHalt
) 
 344                                 uint8_t EndpointIndex 
= ((uint8_t)USB_ControlRequest
.wIndex 
& ENDPOINT_EPNUM_MASK
); 
 346                                 if (EndpointIndex 
== ENDPOINT_CONTROLEP
) 
 349                                 Endpoint_SelectEndpoint(EndpointIndex
); 
 351                                 if (Endpoint_IsEnabled()) 
 353                                         if (USB_ControlRequest
.bRequest 
== REQ_SetFeature
) 
 355                                                 Endpoint_StallTransaction(); 
 359                                                 Endpoint_ClearStall(); 
 360                                                 Endpoint_ResetEndpoint(EndpointIndex
); 
 361                                                 Endpoint_ResetDataToggle(); 
 372         Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP
); 
 374         Endpoint_ClearSETUP(); 
 376         Endpoint_ClearStatusStage();