Fix STK525 and STK526 device support in the Atmel Studio extension.
[pub/USBasp.git] / LUFA / Drivers / USB / Core / AVR8 / USBController_AVR8.c
1 /*
2 LUFA Library
3 Copyright (C) Dean Camera, 2013.
4
5 dean [at] fourwalledcubicle [dot] com
6 www.lufa-lib.org
7 */
8
9 /*
10 Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com)
11
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.
20
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
28 this software.
29 */
30
31 #include "../../../../Common/Common.h"
32 #if (ARCH == ARCH_AVR8)
33
34 #define __INCLUDE_FROM_USB_DRIVER
35 #define __INCLUDE_FROM_USB_CONTROLLER_C
36 #include "../USBController.h"
37
38 #if defined(USB_CAN_BE_BOTH)
39 volatile uint8_t USB_CurrentMode = USB_MODE_None;
40 #endif
41
42 #if !defined(USE_STATIC_OPTIONS)
43 volatile uint8_t USB_Options;
44 #endif
45
46 void USB_Init(
47 #if defined(USB_CAN_BE_BOTH)
48 const uint8_t Mode
49 #endif
50
51 #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS))
52 ,
53 #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
54 void
55 #endif
56
57 #if !defined(USE_STATIC_OPTIONS)
58 const uint8_t Options
59 #endif
60 )
61 {
62 #if !defined(USE_STATIC_OPTIONS)
63 USB_Options = Options;
64 #endif
65
66 #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
67 /* Workaround for AVR8 bootloaders that fail to turn off the OTG pad before running
68 * the loaded application. This causes VBUS detection to fail unless we first force
69 * it off to reset it. */
70 USB_OTGPAD_Off();
71 #endif
72
73 if (!(USB_Options & USB_OPT_REG_DISABLED))
74 USB_REG_On();
75 else
76 USB_REG_Off();
77
78 if (!(USB_Options & USB_OPT_MANUAL_PLL))
79 {
80 #if defined(USB_SERIES_4_AVR)
81 PLLFRQ = (1 << PDIV2);
82 #endif
83 }
84
85 #if defined(USB_CAN_BE_BOTH)
86 if (Mode == USB_MODE_UID)
87 {
88 UHWCON |= (1 << UIDE);
89 USB_INT_Enable(USB_INT_IDTI);
90 USB_CurrentMode = USB_GetUSBModeFromUID();
91 }
92 else
93 {
94 UHWCON &= ~(1 << UIDE);
95 USB_CurrentMode = Mode;
96 }
97 #endif
98
99 USB_IsInitialized = true;
100
101 USB_ResetInterface();
102 }
103
104 void USB_Disable(void)
105 {
106 USB_INT_DisableAllInterrupts();
107 USB_INT_ClearAllInterrupts();
108
109 USB_Detach();
110 USB_Controller_Disable();
111
112 if (!(USB_Options & USB_OPT_MANUAL_PLL))
113 USB_PLL_Off();
114
115 USB_REG_Off();
116
117 #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
118 USB_OTGPAD_Off();
119 #endif
120
121 #if defined(USB_CAN_BE_BOTH)
122 USB_CurrentMode = USB_MODE_None;
123 #endif
124
125 USB_IsInitialized = false;
126 }
127
128 void USB_ResetInterface(void)
129 {
130 #if defined(USB_CAN_BE_BOTH)
131 bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0);
132 #endif
133
134 USB_INT_DisableAllInterrupts();
135 USB_INT_ClearAllInterrupts();
136
137 USB_Controller_Reset();
138
139 #if defined(USB_CAN_BE_BOTH)
140 if (UIDModeSelectEnabled)
141 USB_INT_Enable(USB_INT_IDTI);
142 #endif
143
144 USB_CLK_Unfreeze();
145
146 if (USB_CurrentMode == USB_MODE_Device)
147 {
148 #if defined(USB_CAN_BE_DEVICE)
149 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
150 UHWCON |= (1 << UIMOD);
151 #endif
152
153 if (!(USB_Options & USB_OPT_MANUAL_PLL))
154 {
155 #if defined(USB_SERIES_2_AVR)
156 USB_PLL_On();
157 while (!(USB_PLL_IsReady()));
158 #else
159 USB_PLL_Off();
160 #endif
161 }
162
163 USB_Init_Device();
164 #endif
165 }
166 else if (USB_CurrentMode == USB_MODE_Host)
167 {
168 #if defined(USB_CAN_BE_HOST)
169 UHWCON &= ~(1 << UIMOD);
170
171 if (!(USB_Options & USB_OPT_MANUAL_PLL))
172 {
173 #if defined(USB_CAN_BE_HOST)
174 USB_PLL_On();
175 while (!(USB_PLL_IsReady()));
176 #endif
177 }
178
179 USB_Init_Host();
180 #endif
181 }
182
183 #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
184 USB_OTGPAD_On();
185 #endif
186 }
187
188 #if defined(USB_CAN_BE_DEVICE)
189 static void USB_Init_Device(void)
190 {
191 USB_DeviceState = DEVICE_STATE_Unattached;
192 USB_Device_ConfigurationNumber = 0;
193
194 #if !defined(NO_DEVICE_REMOTE_WAKEUP)
195 USB_Device_RemoteWakeupEnabled = false;
196 #endif
197
198 #if !defined(NO_DEVICE_SELF_POWER)
199 USB_Device_CurrentlySelfPowered = false;
200 #endif
201
202 #if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
203 USB_Descriptor_Device_t* DeviceDescriptorPtr;
204
205 #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
206 !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
207 uint8_t DescriptorAddressSpace;
208
209 if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr, &DescriptorAddressSpace) != NO_DESCRIPTOR)
210 {
211 if (DescriptorAddressSpace == MEMSPACE_FLASH)
212 USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
213 else if (DescriptorAddressSpace == MEMSPACE_EEPROM)
214 USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
215 else
216 USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
217 }
218 #else
219 if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
220 {
221 #if defined(USE_RAM_DESCRIPTORS)
222 USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
223 #elif defined(USE_EEPROM_DESCRIPTORS)
224 USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
225 #else
226 USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
227 #endif
228 }
229 #endif
230 #endif
231
232 #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
233 if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
234 USB_Device_SetLowSpeed();
235 else
236 USB_Device_SetFullSpeed();
237
238 USB_INT_Enable(USB_INT_VBUSTI);
239 #endif
240
241 Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
242 USB_Device_ControlEndpointSize, 1);
243
244 USB_INT_Clear(USB_INT_SUSPI);
245 USB_INT_Enable(USB_INT_SUSPI);
246 USB_INT_Enable(USB_INT_EORSTI);
247
248 USB_Attach();
249 }
250 #endif
251
252 #if defined(USB_CAN_BE_HOST)
253 static void USB_Init_Host(void)
254 {
255 USB_HostState = HOST_STATE_Unattached;
256 USB_Host_ConfigurationNumber = 0;
257 USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
258
259 USB_Host_HostMode_On();
260
261 USB_Host_VBUS_Auto_Off();
262 USB_Host_VBUS_Manual_Enable();
263 USB_Host_VBUS_Manual_On();
264
265 USB_INT_Enable(USB_INT_SRPI);
266 USB_INT_Enable(USB_INT_BCERRI);
267
268 USB_Attach();
269 }
270 #endif
271
272 #endif