3 Copyright (C) Dean Camera, 2017.
5 dean [at] fourwalledcubicle [dot] com
10 Copyright 2017 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
):
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
;
307 case (REQDIR_DEVICETOHOST
| REQTYPE_STANDARD
| REQREC_ENDPOINT
):
309 #if !defined(CONTROL_ONLY_DEVICE)
310 uint8_t EndpointIndex
= ((uint8_t)USB_ControlRequest
.wIndex
& ENDPOINT_EPNUM_MASK
);
312 if (EndpointIndex
>= ENDPOINT_TOTAL_ENDPOINTS
)
315 Endpoint_SelectEndpoint(EndpointIndex
);
317 CurrentStatus
= Endpoint_IsStalled();
319 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP
);
328 Endpoint_ClearSETUP();
330 Endpoint_Write_16_LE(CurrentStatus
);
333 Endpoint_ClearStatusStage();
336 static void USB_Device_ClearSetFeature(void)
338 switch (USB_ControlRequest
.bmRequestType
& CONTROL_REQTYPE_RECIPIENT
)
340 #if !defined(NO_DEVICE_REMOTE_WAKEUP)
343 if ((uint8_t)USB_ControlRequest
.wValue
== FEATURE_SEL_DeviceRemoteWakeup
)
344 USB_Device_RemoteWakeupEnabled
= (USB_ControlRequest
.bRequest
== REQ_SetFeature
);
351 #if !defined(CONTROL_ONLY_DEVICE)
352 case REQREC_ENDPOINT
:
354 if ((uint8_t)USB_ControlRequest
.wValue
== FEATURE_SEL_EndpointHalt
)
356 uint8_t EndpointIndex
= ((uint8_t)USB_ControlRequest
.wIndex
& ENDPOINT_EPNUM_MASK
);
358 if (EndpointIndex
== ENDPOINT_CONTROLEP
|| EndpointIndex
>= ENDPOINT_TOTAL_ENDPOINTS
)
361 Endpoint_SelectEndpoint(EndpointIndex
);
363 if (Endpoint_IsEnabled())
365 if (USB_ControlRequest
.bRequest
== REQ_SetFeature
)
367 Endpoint_StallTransaction();
371 Endpoint_ClearStall();
372 Endpoint_ResetEndpoint(EndpointIndex
);
373 Endpoint_ResetDataToggle();
385 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP
);
387 Endpoint_ClearSETUP();
389 Endpoint_ClearStatusStage();