00001
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #include "conf_usb.h"
00054
00055
00056 #if USB_DEVICE_FEATURE == ENABLED
00057
00058 #include "compiler.h"
00059 #ifdef FREERTOS_USED
00060 #include "FreeRTOS.h"
00061 #include "task.h"
00062 #endif
00063 #include "usb_drv.h"
00064 #include "usb_task.h"
00065 #include "usb_descriptors.h"
00066 #include "usb_standard_request.h"
00067 #include "usb_device_task.h"
00068
00069
00070
00071
00072
00073
00074
00080 volatile Bool usb_connected;
00081
00082 #ifdef FREERTOS_USED
00084 xTaskHandle usb_device_tsk = NULL;
00085 #endif
00086
00087
00088
00089
00097 void usb_device_task_init(void)
00098 {
00099 usb_connected = FALSE;
00100 usb_configuration_nb = 0;
00102
00103
00104 Disable_global_interrupt();
00105 Usb_disable();
00106 (void)Is_usb_enabled();
00107 Enable_global_interrupt();
00108 Usb_disable_otg_pad();
00109 Usb_enable_otg_pad();
00110 Usb_enable();
00111 #if __AVR32_UC3A3256__ || __AVR32_UC3A3128__ || __AVR32_UC3A364__ || \
00112 __AVR32_UC3A3256S__ || __AVR32_UC3A3128S__ || __AVR32_UC3A364S__ || \
00113 __AT32UC3A3256__ || __AT32UC3A3128__ || __AT32UC3A364__ || \
00114 __AT32UC3A3256S__ || __AT32UC3A3128S__ || __AT32UC3A364S__
00115 Set_bits(AVR32_USBB_udcon, (3<<10));
00116 # warning Force UC3A3 USB macro to work in Full-Speed.
00117 #endif
00118 Usb_unfreeze_clock();
00119 (void)Is_usb_clock_frozen();
00120 Usb_ack_suspend();
00121 Usb_enable_vbus_interrupt();
00122 Enable_global_interrupt();
00123
00124 #ifdef FREERTOS_USED
00125 xTaskCreate(usb_device_task,
00126 configTSK_USB_DEV_NAME,
00127 configTSK_USB_DEV_STACK_SIZE,
00128 NULL,
00129 configTSK_USB_DEV_PRIORITY,
00130 &usb_device_tsk);
00131 #endif // FREERTOS_USED
00132 }
00133
00134
00144 void usb_start_device(void)
00145 {
00146 Usb_enable_suspend_interrupt();
00147 Usb_enable_reset_interrupt();
00148
00149 #if (USB_HIGH_SPEED_SUPPORT==DISABLED)
00150 Usb_force_full_speed_mode();
00151 #else
00152 Usb_use_dual_speed_mode();
00153 #endif
00154
00155 usb_init_device();
00156 Usb_attach();
00157 usb_connected = TRUE;
00158 }
00159
00160
00169 #ifdef FREERTOS_USED
00170 void usb_device_task(void *pvParameters)
00171 #else
00172 void usb_device_task(void)
00173 #endif
00174 {
00175 #ifdef FREERTOS_USED
00176 portTickType xLastWakeTime;
00177
00178 xLastWakeTime = xTaskGetTickCount();
00179 while (TRUE)
00180 {
00181 vTaskDelayUntil(&xLastWakeTime, configTSK_USB_DEV_PERIOD);
00182
00183 #endif // FREERTOS_USED
00184 if (!usb_connected && Is_usb_vbus_high())
00185 {
00186 usb_start_device();
00187 Usb_send_event(EVT_USB_POWERED);
00188 Usb_vbus_on_action();
00189 }
00190
00191 if (Is_usb_event(EVT_USB_RESET))
00192 {
00193 Usb_ack_event(EVT_USB_RESET);
00194 Usb_reset_endpoint(EP_CONTROL);
00195 usb_configuration_nb = 0;
00196 }
00197
00198
00199 if (Is_usb_setup_received())
00200 {
00201 usb_process_request();
00202 }
00203 #ifdef FREERTOS_USED
00204 }
00205 #endif
00206 }
00207
00208
00209 #endif // USB_DEVICE_FEATURE == ENABLED