3 Copyright (C) Dean Camera, 2012.
5 dean [at] fourwalledcubicle [dot] com
10 Copyright 2012 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_StallTransaction();
121 Endpoint_ClearSETUP();
125 static void USB_Device_SetAddress(void)
127 uint8_t DeviceAddress
= (USB_ControlRequest
.wValue
& 0x7F);
128 uint_reg_t CurrentGlobalInt
= GetGlobalInterruptMask();
129 GlobalInterruptDisable();
131 Endpoint_ClearSETUP();
133 Endpoint_ClearStatusStage();
135 while (!(Endpoint_IsINReady()));
137 USB_Device_SetDeviceAddress(DeviceAddress
);
138 USB_DeviceState
= (DeviceAddress
) ? DEVICE_STATE_Addressed
: DEVICE_STATE_Default
;
140 SetGlobalInterruptMask(CurrentGlobalInt
);
143 static void USB_Device_SetConfiguration(void)
145 #if defined(FIXED_NUM_CONFIGURATIONS)
146 if ((uint8_t)USB_ControlRequest
.wValue
> FIXED_NUM_CONFIGURATIONS
)
149 USB_Descriptor_Device_t
* DevDescriptorPtr
;
151 #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE)
152 #if defined(USE_FLASH_DESCRIPTORS)
153 #define MemoryAddressSpace MEMSPACE_FLASH
154 #elif defined(USE_EEPROM_DESCRIPTORS)
155 #define MemoryAddressSpace MEMSPACE_EEPROM
156 #elif defined(USE_SRAM_DESCRIPTORS)
157 #define MemoryAddressSpace MEMSPACE_SRAM
159 uint8_t MemoryAddressSpace
;
163 if (CALLBACK_USB_GetDescriptor((DTYPE_Device
<< 8), 0, (void*)&DevDescriptorPtr
164 #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
165 !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
166 , &MemoryAddressSpace
173 #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE)
174 if (MemoryAddressSpace
== MEMSPACE_FLASH
)
176 if (((uint8_t)USB_ControlRequest
.wValue
> pgm_read_byte(&DevDescriptorPtr
->NumberOfConfigurations
)))
179 else if (MemoryAddressSpace
== MEMSPACE_EEPROM
)
181 if (((uint8_t)USB_ControlRequest
.wValue
> eeprom_read_byte(&DevDescriptorPtr
->NumberOfConfigurations
)))
186 if ((uint8_t)USB_ControlRequest
.wValue
> DevDescriptorPtr
->NumberOfConfigurations
)
190 if ((uint8_t)USB_ControlRequest
.wValue
> DevDescriptorPtr
->NumberOfConfigurations
)
195 Endpoint_ClearSETUP();
197 USB_Device_ConfigurationNumber
= (uint8_t)USB_ControlRequest
.wValue
;
199 Endpoint_ClearStatusStage();
201 if (USB_Device_ConfigurationNumber
)
202 USB_DeviceState
= DEVICE_STATE_Configured
;
204 USB_DeviceState
= (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured
: DEVICE_STATE_Powered
;
206 EVENT_USB_Device_ConfigurationChanged();
209 static void USB_Device_GetConfiguration(void)
211 Endpoint_ClearSETUP();
213 Endpoint_Write_8(USB_Device_ConfigurationNumber
);
216 Endpoint_ClearStatusStage();
219 #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
220 static void USB_Device_GetInternalSerialDescriptor(void)
224 USB_Descriptor_Header_t Header
;
225 uint16_t UnicodeString
[INTERNAL_SERIAL_LENGTH_BITS
/ 4];
226 } SignatureDescriptor
;
228 SignatureDescriptor
.Header
.Type
= DTYPE_String
;
229 SignatureDescriptor
.Header
.Size
= USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS
/ 4);
231 USB_Device_GetSerialString(SignatureDescriptor
.UnicodeString
);
233 Endpoint_ClearSETUP();
235 Endpoint_Write_Control_Stream_LE(&SignatureDescriptor
, sizeof(SignatureDescriptor
));
240 static void USB_Device_GetDescriptor(void)
242 const void* DescriptorPointer
;
243 uint16_t DescriptorSize
;
245 #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
246 !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
247 uint8_t DescriptorAddressSpace
;
250 #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
251 if (USB_ControlRequest
.wValue
== ((DTYPE_String
<< 8) | USE_INTERNAL_SERIAL
))
253 USB_Device_GetInternalSerialDescriptor();
258 if ((DescriptorSize
= CALLBACK_USB_GetDescriptor(USB_ControlRequest
.wValue
, USB_ControlRequest
.wIndex
,
260 #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
261 !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
262 , &DescriptorAddressSpace
269 Endpoint_ClearSETUP();
271 #if defined(USE_RAM_DESCRIPTORS) || !defined(ARCH_HAS_MULTI_ADDRESS_SPACE)
272 Endpoint_Write_Control_Stream_LE(DescriptorPointer
, DescriptorSize
);
273 #elif defined(USE_EEPROM_DESCRIPTORS)
274 Endpoint_Write_Control_EStream_LE(DescriptorPointer
, DescriptorSize
);
275 #elif defined(USE_FLASH_DESCRIPTORS)
276 Endpoint_Write_Control_PStream_LE(DescriptorPointer
, DescriptorSize
);
278 if (DescriptorAddressSpace
== MEMSPACE_FLASH
)
279 Endpoint_Write_Control_PStream_LE(DescriptorPointer
, DescriptorSize
);
280 else if (DescriptorAddressSpace
== MEMSPACE_EEPROM
)
281 Endpoint_Write_Control_EStream_LE(DescriptorPointer
, DescriptorSize
);
283 Endpoint_Write_Control_Stream_LE(DescriptorPointer
, DescriptorSize
);
289 static void USB_Device_GetStatus(void)
291 uint8_t CurrentStatus
= 0;
293 switch (USB_ControlRequest
.bmRequestType
)
295 case (REQDIR_DEVICETOHOST
| REQTYPE_STANDARD
| REQREC_DEVICE
):
296 #if !defined(NO_DEVICE_SELF_POWER)
297 if (USB_Device_CurrentlySelfPowered
)
298 CurrentStatus
|= FEATURE_SELFPOWERED_ENABLED
;
301 #if !defined(NO_DEVICE_REMOTE_WAKEUP)
302 if (USB_Device_RemoteWakeupEnabled
)
303 CurrentStatus
|= FEATURE_REMOTE_WAKEUP_ENABLED
;
306 case (REQDIR_DEVICETOHOST
| REQTYPE_STANDARD
| REQREC_ENDPOINT
):
307 #if !defined(CONTROL_ONLY_DEVICE)
308 Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest
.wIndex
& ENDPOINT_EPNUM_MASK
);
310 CurrentStatus
= Endpoint_IsStalled();
312 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP
);
320 Endpoint_ClearSETUP();
322 Endpoint_Write_16_LE(CurrentStatus
);
325 Endpoint_ClearStatusStage();
328 static void USB_Device_ClearSetFeature(void)
330 switch (USB_ControlRequest
.bmRequestType
& CONTROL_REQTYPE_RECIPIENT
)
332 #if !defined(NO_DEVICE_REMOTE_WAKEUP)
334 if ((uint8_t)USB_ControlRequest
.wValue
== FEATURE_SEL_DeviceRemoteWakeup
)
335 USB_Device_RemoteWakeupEnabled
= (USB_ControlRequest
.bRequest
== REQ_SetFeature
);
341 #if !defined(CONTROL_ONLY_DEVICE)
342 case REQREC_ENDPOINT
:
343 if ((uint8_t)USB_ControlRequest
.wValue
== FEATURE_SEL_EndpointHalt
)
345 uint8_t EndpointIndex
= ((uint8_t)USB_ControlRequest
.wIndex
& ENDPOINT_EPNUM_MASK
);
347 if (EndpointIndex
== ENDPOINT_CONTROLEP
)
350 Endpoint_SelectEndpoint(EndpointIndex
);
352 if (Endpoint_IsEnabled())
354 if (USB_ControlRequest
.bRequest
== REQ_SetFeature
)
356 Endpoint_StallTransaction();
360 Endpoint_ClearStall();
361 Endpoint_ResetEndpoint(EndpointIndex
);
362 Endpoint_ResetDataToggle();
373 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP
);
375 Endpoint_ClearSETUP();
377 Endpoint_ClearStatusStage();