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();