00001
00015
00016
00017
00018
00019
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
00070
00071
00072 #include "preprocessor.h"
00073 #include "compiler.h"
00074 #include "board.h"
00075 #include "pm.h"
00076 #include "rtc.h"
00077 #include "cycle_counter.h"
00078 #include "flashc.h"
00079 #include "conf_usb.h"
00080 #include "usb_drv.h"
00081 #include "usb_task.h"
00082 #if USB_DEVICE_FEATURE == ENABLED
00083 #include "usb_dfu.h"
00084 #endif
00085 #include "conf_isp.h"
00086 #include "isp.h"
00087 #include "autobaud.h"
00088
00089
00090
00091
00092
00093
00094
00095 #if UC3A3
00096 #define TC (&AVR32_TC0)
00097 #else
00098 #define TC (&AVR32_TC)
00099 #endif
00100 #define PM (&AVR32_PM)
00101 #define TC_32KHZ_CHANNEL 0
00102
00103 void wait_10_ms(void)
00104 {
00105 Set_system_register(AVR32_COUNT, 0);
00106 while ((U32)Get_system_register(AVR32_COUNT) < (FRCOSC * 10 + 999) / 1000);
00107 }
00108
00109 static void osc_rtc_counter_reset(void)
00110 {
00111 rtc_set_value(&AVR32_RTC, 0);
00112 }
00113
00114 static int osc_rtc_counter_value(void)
00115 {
00116 return rtc_get_value(&AVR32_RTC) * 2;
00117 }
00118
00119 static void osc_isp_counter_reset(void)
00120 {
00121 Set_sys_count(0);
00122 }
00123
00124 static int osc_isp_counter_value(void)
00125 {
00126 return Get_sys_count();
00127 }
00128
00132 void sys_clk_gen_start(void)
00133 {
00134 int cpu_freq_hz, mul;
00135 const int freq_hz[] = { 8000000, 12000000, 16000000 };
00136 const struct autobaud_cfg_osc_cmp_t autobaud_cfg = {
00137 .osc_ref_freq_hz = 115000,
00138 .osc_ref_counter_reset = osc_rtc_counter_reset,
00139 .osc_ref_counter_value = osc_rtc_counter_value,
00140 .osc_target_counter_reset = osc_isp_counter_reset,
00141 .osc_target_counter_value = osc_isp_counter_value,
00142 .convergence_rate = 10000
00143 };
00144 const struct autobaud_matching_freq_t match_freq = {
00145 .freq_hz = freq_hz,
00146 .nb_entries = sizeof(freq_hz)/sizeof(freq_hz[0])
00147 };
00148 Bool sav_glob_int_en;
00149
00150 #define MAX_OSC_FREQ 16000000
00151
00152
00153
00154
00155
00156 pm_switch_to_osc0(&AVR32_PM, MAX_OSC_FREQ, ATPASTE3(AVR32_PM_OSCCTRL, ISP_OSC, _STARTUP_16384_RCOSC));
00157
00158
00159 rtc_init(&AVR32_RTC, RTC_OSC_RC, 0);
00160 rtc_enable(&AVR32_RTC);
00161
00162
00163 if (!(cpu_freq_hz = autobaud_detect_osc_cmp(&autobaud_cfg)))
00164 cpu_freq_hz = 12000000;
00165 cpu_freq_hz = autobaud_match_frequency(cpu_freq_hz, &match_freq);
00166
00167 switch (cpu_freq_hz)
00168 {
00169 case 8000000:
00170 mul = 5;
00171 break;
00172 case 12000000:
00173 mul = 3;
00174 break;
00175 case 16000000:
00176 mul = 2;
00177 break;
00178 default:
00179 mul = 3;
00180 }
00181
00182 Usb_freeze_clock();
00183
00184
00185 pm_pll_setup(PM, 0,
00186 mul,
00187 0,
00188 ISP_OSC,
00189 63);
00190
00191 if ((sav_glob_int_en = Is_global_interrupt_enabled())) Disable_global_interrupt();
00192
00193
00194 pm_pll_set_option(PM, 0,
00195 1,
00196 1,
00197 0);
00198
00199
00200 pm_pll_enable(PM, 0);
00201
00202
00203 pm_wait_for_pll0_locked(PM);
00204
00205
00206 pm_gc_setup(PM, AVR32_PM_GCLK_USBB,
00207 1,
00208 0,
00209 #if UC3A3
00210 1,
00211 1);
00212 #else
00213 0,
00214 0);
00215 #endif
00216
00217
00218 pm_gc_enable(PM, AVR32_PM_GCLK_USBB);
00219
00220 Usb_unfreeze_clock();
00221
00222
00223 flashc_set_wait_state(1);
00224
00225
00226 pm_switch_to_clock(PM, AVR32_PM_MCCTRL_MCSEL_PLL0);
00227
00228
00229
00230
00231 pm_cksel(PM, 1,
00232 1,
00233 1,
00234 1,
00235 1,
00236 1);
00237
00238
00239 flashc_set_wait_state(0);
00240
00241 Usb_ack_sof();
00242
00243 if (sav_glob_int_en) Enable_global_interrupt();
00244 }
00245
00246
00250 void sys_clk_gen_stop(void)
00251 {
00252 volatile avr32_pm_t *const pm = &AVR32_PM;
00253
00254 pm_gc_disable(pm, AVR32_PM_GCLK_USBB);
00255 pm_gc_setup(pm, AVR32_PM_GCLK_USBB, 0, 0, 0, 0);
00256 flashc_set_wait_state(1);
00257 pm_cksel(pm, 0, 0, 0, 0, 0, 0);
00258 pm_switch_to_clock(pm, AVR32_PM_MCCTRL_MCSEL_SLOW);
00259 flashc_set_wait_state(0);
00260 pm_pll_disable(pm, 0);
00261 pm_pll_set_option(pm, 0, 0, 0, 0);
00262 pm_pll_setup(pm, 0, 0, 0, 0, 0);
00263 pm_enable_clk_no_wait(pm, ATPASTE3(AVR32_PM_OSCCTRL, ISP_OSC, _STARTUP_0_RCOSC));
00264 pm_disable_clk(pm);
00265 pm_enable_osc_ext_clock(pm);
00266 }
00267
00268
00269 int main(void)
00270 {
00271 wait_10_ms();
00272
00273 Usb_force_full_speed_mode();
00274 usb_task_init();
00275 #if USB_DEVICE_FEATURE == ENABLED
00276 usb_dfu_init();
00277 #endif
00278
00279 while (TRUE)
00280 {
00281 usb_task();
00282 }
00283 }