3      Copyright (C) Dean Camera, 2011. 
   5   dean [at] fourwalledcubicle [dot] com 
  10   Copyright 2011  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 disclaim 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_ConfigurationNumber
; 
  41 #if !defined(NO_DEVICE_SELF_POWER) 
  42 bool    USB_CurrentlySelfPowered
; 
  45 #if !defined(NO_DEVICE_REMOTE_WAKEUP) 
  46 bool    USB_RemoteWakeupEnabled
; 
  49 void USB_Device_ProcessControlRequest(void) 
  51         USB_ControlRequest
.bmRequestType 
= Endpoint_Read_8(); 
  52         USB_ControlRequest
.bRequest      
= Endpoint_Read_8(); 
  53         USB_ControlRequest
.wValue        
= Endpoint_Read_16_LE(); 
  54         USB_ControlRequest
.wIndex        
= Endpoint_Read_16_LE(); 
  55         USB_ControlRequest
.wLength       
= Endpoint_Read_16_LE(); 
  57         EVENT_USB_Device_ControlRequest(); 
  59         if (Endpoint_IsSETUPReceived()) 
  61                 uint8_t bmRequestType 
= USB_ControlRequest
.bmRequestType
; 
  63                 switch (USB_ControlRequest
.bRequest
) 
  66                                 if ((bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) || 
  67                                         (bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_ENDPOINT
))) 
  69                                         USB_Device_GetStatus(); 
  73                         case REQ_ClearFeature
: 
  75                                 if ((bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) || 
  76                                         (bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_STANDARD 
| REQREC_ENDPOINT
))) 
  78                                         USB_Device_ClearSetFeature(); 
  83                                 if (bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) 
  84                                   USB_Device_SetAddress(); 
  87                         case REQ_GetDescriptor
: 
  88                                 if ((bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) || 
  89                                         (bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_INTERFACE
))) 
  91                                         USB_Device_GetDescriptor(); 
  95                         case REQ_GetConfiguration
: 
  96                                 if (bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) 
  97                                   USB_Device_GetConfiguration(); 
 100                         case REQ_SetConfiguration
: 
 101                                 if (bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_STANDARD 
| REQREC_DEVICE
)) 
 102                                   USB_Device_SetConfiguration(); 
 108         if (Endpoint_IsSETUPReceived()) 
 110                 Endpoint_StallTransaction(); 
 111                 Endpoint_ClearSETUP(); 
 115 static void USB_Device_SetAddress(void) 
 117         uint8_t    DeviceAddress    
= (USB_ControlRequest
.wValue 
& 0x7F); 
 118         uint_reg_t CurrentGlobalInt 
= GetGlobalInterruptMask(); 
 119         GlobalInterruptDisable(); 
 121         Endpoint_ClearSETUP(); 
 123         Endpoint_ClearStatusStage(); 
 125         while (!(Endpoint_IsINReady())); 
 127         USB_Device_SetDeviceAddress(DeviceAddress
); 
 128         USB_DeviceState 
= (DeviceAddress
) ? DEVICE_STATE_Addressed 
: DEVICE_STATE_Default
; 
 130         SetGlobalInterruptMask(CurrentGlobalInt
); 
 133 static void USB_Device_SetConfiguration(void) 
 135         #if defined(FIXED_NUM_CONFIGURATIONS) 
 136         if ((uint8_t)USB_ControlRequest
.wValue 
> FIXED_NUM_CONFIGURATIONS
) 
 139         USB_Descriptor_Device_t
* DevDescriptorPtr
; 
 141         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) 
 142                 #if defined(USE_FLASH_DESCRIPTORS) 
 143                         #define MemoryAddressSpace  MEMSPACE_FLASH 
 144                 #elif defined(USE_EEPROM_DESCRIPTORS) 
 145                         #define MemoryAddressSpace  MEMSPACE_EEPROM 
 146                 #elif defined(USE_SRAM_DESCRIPTORS) 
 147                         #define MemoryAddressSpace  MEMSPACE_SRAM 
 149                         uint8_t MemoryAddressSpace
; 
 153         if (CALLBACK_USB_GetDescriptor((DTYPE_Device 
<< 8), 0, (void*)&DevDescriptorPtr
 
 154         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ 
 155             !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) 
 156                                        , &MemoryAddressSpace
 
 163         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) 
 164         if (MemoryAddressSpace 
== MEMSPACE_FLASH
) 
 166                 if (((uint8_t)USB_ControlRequest
.wValue 
> pgm_read_byte(&DevDescriptorPtr
->NumberOfConfigurations
))) 
 169         else if (MemoryAddressSpace 
== MEMSPACE_EEPROM
) 
 171                 if (((uint8_t)USB_ControlRequest
.wValue 
> eeprom_read_byte(&DevDescriptorPtr
->NumberOfConfigurations
))) 
 176                 if ((uint8_t)USB_ControlRequest
.wValue 
> DevDescriptorPtr
->NumberOfConfigurations
) 
 180         if ((uint8_t)USB_ControlRequest
.wValue 
> DevDescriptorPtr
->NumberOfConfigurations
) 
 185         Endpoint_ClearSETUP(); 
 187         USB_ConfigurationNumber 
= (uint8_t)USB_ControlRequest
.wValue
; 
 189         Endpoint_ClearStatusStage(); 
 191         if (USB_ConfigurationNumber
) 
 192           USB_DeviceState 
= DEVICE_STATE_Configured
; 
 194           USB_DeviceState 
= (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured 
: DEVICE_STATE_Powered
; 
 196         EVENT_USB_Device_ConfigurationChanged(); 
 199 static void USB_Device_GetConfiguration(void) 
 201         Endpoint_ClearSETUP(); 
 203         Endpoint_Write_8(USB_ConfigurationNumber
); 
 206         Endpoint_ClearStatusStage(); 
 209 #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) 
 210 static void USB_Device_GetInternalSerialDescriptor(void) 
 214                 USB_Descriptor_Header_t Header
; 
 215                 uint16_t                UnicodeString
[INTERNAL_SERIAL_LENGTH_BITS 
/ 4]; 
 216         } SignatureDescriptor
; 
 218         SignatureDescriptor
.Header
.Type 
= DTYPE_String
; 
 219         SignatureDescriptor
.Header
.Size 
= USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS 
/ 4); 
 221         USB_Device_GetSerialString(SignatureDescriptor
.UnicodeString
); 
 223         Endpoint_ClearSETUP(); 
 225         Endpoint_Write_Control_Stream_LE(&SignatureDescriptor
, sizeof(SignatureDescriptor
)); 
 230 static void USB_Device_GetDescriptor(void) 
 232         const void* DescriptorPointer
; 
 233         uint16_t    DescriptorSize
; 
 235         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ 
 236             !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) 
 237         uint8_t DescriptorAddressSpace
; 
 240         #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) 
 241         if (USB_ControlRequest
.wValue 
== ((DTYPE_String 
<< 8) | USE_INTERNAL_SERIAL
)) 
 243                 USB_Device_GetInternalSerialDescriptor(); 
 248         if ((DescriptorSize 
= CALLBACK_USB_GetDescriptor(USB_ControlRequest
.wValue
, USB_ControlRequest
.wIndex
, 
 250         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ 
 251             !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) 
 252                                                          , &DescriptorAddressSpace
 
 259         Endpoint_ClearSETUP(); 
 261         #if defined(USE_RAM_DESCRIPTORS) || !defined(ARCH_HAS_MULTI_ADDRESS_SPACE) 
 262         Endpoint_Write_Control_Stream_LE(DescriptorPointer
, DescriptorSize
); 
 263         #elif defined(USE_EEPROM_DESCRIPTORS) 
 264         Endpoint_Write_Control_EStream_LE(DescriptorPointer
, DescriptorSize
); 
 265         #elif defined(USE_FLASH_DESCRIPTORS) 
 266         Endpoint_Write_Control_PStream_LE(DescriptorPointer
, DescriptorSize
); 
 268         if (DescriptorAddressSpace 
== MEMSPACE_FLASH
) 
 269           Endpoint_Write_Control_PStream_LE(DescriptorPointer
, DescriptorSize
); 
 270         else if (DescriptorAddressSpace 
== MEMSPACE_EEPROM
) 
 271           Endpoint_Write_Control_EStream_LE(DescriptorPointer
, DescriptorSize
); 
 273           Endpoint_Write_Control_Stream_LE(DescriptorPointer
, DescriptorSize
); 
 279 static void USB_Device_GetStatus(void) 
 281         uint8_t CurrentStatus 
= 0; 
 283         switch (USB_ControlRequest
.bmRequestType
) 
 285                 #if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP) 
 286                 case (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_DEVICE
): 
 287                         #if !defined(NO_DEVICE_SELF_POWER) 
 288                         if (USB_CurrentlySelfPowered
) 
 289                           CurrentStatus 
|= FEATURE_SELFPOWERED_ENABLED
; 
 292                         #if !defined(NO_DEVICE_REMOTE_WAKEUP) 
 293                         if (USB_RemoteWakeupEnabled
) 
 294                           CurrentStatus 
|= FEATURE_REMOTE_WAKEUP_ENABLED
; 
 298                 #if !defined(CONTROL_ONLY_DEVICE) 
 299                 case (REQDIR_DEVICETOHOST 
| REQTYPE_STANDARD 
| REQREC_ENDPOINT
): 
 300                         Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest
.wIndex 
& ENDPOINT_EPNUM_MASK
); 
 302                         CurrentStatus 
= Endpoint_IsStalled(); 
 304                         Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP
); 
 312         Endpoint_ClearSETUP(); 
 314         Endpoint_Write_16_LE(CurrentStatus
); 
 317         Endpoint_ClearStatusStage(); 
 320 static void USB_Device_ClearSetFeature(void) 
 322         switch (USB_ControlRequest
.bmRequestType 
& CONTROL_REQTYPE_RECIPIENT
) 
 324                 #if !defined(NO_DEVICE_REMOTE_WAKEUP) 
 326                         if ((uint8_t)USB_ControlRequest
.wValue 
== FEATURE_SEL_DeviceRemoteWakeup
) 
 327                           USB_RemoteWakeupEnabled 
= (USB_ControlRequest
.bRequest 
== REQ_SetFeature
); 
 333                 #if !defined(CONTROL_ONLY_DEVICE) 
 334                 case REQREC_ENDPOINT
: 
 335                         if ((uint8_t)USB_ControlRequest
.wValue 
== FEATURE_SEL_EndpointHalt
) 
 337                                 uint8_t EndpointIndex 
= ((uint8_t)USB_ControlRequest
.wIndex 
& ENDPOINT_EPNUM_MASK
); 
 339                                 if (EndpointIndex 
== ENDPOINT_CONTROLEP
) 
 342                                 Endpoint_SelectEndpoint(EndpointIndex
); 
 344                                 if (Endpoint_IsEnabled()) 
 346                                         if (USB_ControlRequest
.bRequest 
== REQ_SetFeature
) 
 348                                                 Endpoint_StallTransaction(); 
 352                                                 Endpoint_ClearStall(); 
 353                                                 Endpoint_ResetEndpoint(EndpointIndex
); 
 354                                                 Endpoint_ResetDataToggle(); 
 365         Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP
); 
 367         Endpoint_ClearSETUP(); 
 369         Endpoint_ClearStatusStage();