00001
00096 #include "intc.h"
00097 #include "power_clocks_lib.h"
00098 #include "gpio.h"
00099 #include "usart.h"
00100 #include "mdma.h"
00101 #include "board.h"
00102 #include "sdramc.h"
00103 #include "flashc_buffer.h"
00104 #include "cycle_counter.h"
00105 #include "print_funcs.h"
00106
00107 #define FCPU_HZ 48000000
00108 #define FPBA_HZ 24000000
00109 #define FPBB_HZ 48000000
00110
00111 #define CHANNEL_NBR 0
00112 #define BUFFER_SIZE 1024
00113 #define TRANSFERT_SIZE MDMA_TRANSFERT_SIZE_WORD
00114 #define BURST_MODE MDMA_SINGLE_TRANSFERT_MODE
00115
00116
00118
00119 #if BOARD == UC3C_EK
00120 # define EXAMPLE_MDMA_USART (&AVR32_USART2)
00121 # define EXAMPLE_MDMA_USART_RX_PIN AVR32_USART2_RXD_0_1_PIN
00122 # define EXAMPLE_MDMA_USART_RX_FUNCTION AVR32_USART2_RXD_0_1_FUNCTION
00123 # define EXAMPLE_MDMA_USART_TX_PIN AVR32_USART2_TXD_0_1_PIN
00124 # define EXAMPLE_MDMA_USART_TX_FUNCTION AVR32_USART2_TXD_0_1_FUNCTION
00125 # define EXAMPLE_MDMA_LED_READ LED1
00126 # define EXAMPLE_MDMA_LED_ERRORS (LED0 | LED1 | LED2 | LED3)
00127 # define EXAMPLE_MDMA_LED_OK (LED0 | LED1 | LED2 | LED3)
00128 #else
00129 #error The board configuration for this example must be defined here.
00130 #endif
00132
00133
00134 volatile avr32_mdma_t* mdma = &AVR32_MDMA;
00135
00138 #if (defined __GNUC__)
00139 __attribute__((__interrupt__))
00140 #elif (defined __ICCAVR32__)
00141 __interrupt
00142 #endif
00143 static void mdma_int_handler(void)
00144 {
00145 Disable_global_interrupt();
00146 U32 status = mdma->isr;
00147 mdma->icr = status;
00148 Enable_global_interrupt();
00149 }
00150
00151 void init_usart(void)
00152 {
00153 static const gpio_map_t USART_GPIO_MAP =
00154 {
00155 {EXAMPLE_MDMA_USART_RX_PIN, EXAMPLE_MDMA_USART_RX_FUNCTION},
00156 {EXAMPLE_MDMA_USART_TX_PIN, EXAMPLE_MDMA_USART_TX_FUNCTION}
00157 };
00158
00159
00160 static const usart_options_t USART_OPTIONS =
00161 {
00162 .baudrate = 57600,
00163 .charlength = 8,
00164 .paritytype = USART_NO_PARITY,
00165 .stopbits = USART_1_STOPBIT,
00166 .channelmode = USART_NORMAL_CHMODE
00167 };
00168
00169
00170 gpio_enable_module(USART_GPIO_MAP,
00171 sizeof(USART_GPIO_MAP) / sizeof(USART_GPIO_MAP[0]));
00172
00173
00174 usart_init_rs232(EXAMPLE_MDMA_USART, &USART_OPTIONS, FPBA_HZ);
00175
00176 print_dbg("MDMA Example : This example demonstrates how to use the MDMA driver. \n");
00177 }
00178
00181 static void init_sys_clocks(void)
00182 {
00185
00186 static pcl_freq_param_t pcl_freq_param =
00187 {
00188 .cpu_f = FCPU_HZ,
00189 .pba_f = FPBA_HZ,
00190 .pbb_f = FPBB_HZ,
00191 .osc0_f = FOSC0,
00192 .osc0_startup = OSC0_STARTUP
00193 };
00195
00196
00197 if (pcl_configure_clocks(&pcl_freq_param) != PASS) {
00198 while(1);
00199 }
00200 }
00201
00202
00203 U32 sram_buffer[BUFFER_SIZE];
00204
00205
00206 mdma_descriptor_t mdma_buf_desc[5];
00207
00210 void mdma_init_buffer_descriptor(void)
00211 {
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 mdma_buf_desc[0].src = (U32)flashc_data;
00222 mdma_buf_desc[0].src = (U32)flashc_data;
00223 mdma_buf_desc[0].dest = (U32)AVR32_EBI_CS1_0_ADDRESS;
00224 mdma_buf_desc[0].ccr.count = BUFFER_SIZE;
00225 mdma_buf_desc[0].ccr.size = TRANSFERT_SIZE;
00226 mdma_buf_desc[0].ccr.burst_size = BURST_MODE;
00227 mdma_buf_desc[0].ccr.tc_ienable = 1;
00228 mdma_buf_desc[0].ccr.V = 1;
00229 mdma_buf_desc[0].ccr.L = 0;
00230
00231 mdma_buf_desc[0].src = (U32)((unsigned short *)flashc_data);
00232 mdma_buf_desc[0].src = (U32)((unsigned short *)flashc_data);
00233 mdma_buf_desc[0].dest = (U32)((unsigned short *)AVR32_EBI_CS1_0_ADDRESS);
00234 mdma_buf_desc[0].ccr.count = BUFFER_SIZE;
00235 mdma_buf_desc[0].ccr.size = TRANSFERT_SIZE;
00236 mdma_buf_desc[0].ccr.burst_size = BURST_MODE;
00237 mdma_buf_desc[0].ccr.tc_ienable = 1;
00238 mdma_buf_desc[0].ccr.V = 1;
00239 mdma_buf_desc[0].ccr.L = 0;
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250 mdma_buf_desc[1].src = (U32)((unsigned short *)AVR32_EBI_CS1_0_ADDRESS);
00251 mdma_buf_desc[1].dest = (U32)((unsigned short *)AVR32_HRAMC0_ADDRESS);
00252 mdma_buf_desc[1].ccr.count = BUFFER_SIZE;
00253 mdma_buf_desc[1].ccr.size = TRANSFERT_SIZE;
00254 mdma_buf_desc[1].ccr.burst_size = BURST_MODE;
00255 mdma_buf_desc[1].ccr.tc_ienable = 1;
00256 mdma_buf_desc[1].ccr.V = 1;
00257 mdma_buf_desc[1].ccr.L = 0;
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 mdma_buf_desc[2].src = (U32)((unsigned short *)AVR32_HRAMC0_ADDRESS);
00269 mdma_buf_desc[2].dest = (U32)sram_buffer;
00270 mdma_buf_desc[2].ccr.count = BUFFER_SIZE;
00271 mdma_buf_desc[2].ccr.size = TRANSFERT_SIZE;
00272 mdma_buf_desc[2].ccr.burst_size = BURST_MODE;
00273 mdma_buf_desc[2].ccr.tc_ienable = 1;
00274 mdma_buf_desc[2].ccr.V = 1;
00275 mdma_buf_desc[2].ccr.L = 0;
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 mdma_buf_desc[3].src = (U32)((unsigned short *)sram_buffer);
00287 mdma_buf_desc[3].dest = (U32)AVR32_HRAMC0_ADDRESS;
00288 mdma_buf_desc[3].ccr.count = BUFFER_SIZE;
00289 mdma_buf_desc[3].ccr.size = TRANSFERT_SIZE;
00290 mdma_buf_desc[3].ccr.burst_size = BURST_MODE;
00291 mdma_buf_desc[3].ccr.tc_ienable = 1;
00292 mdma_buf_desc[3].ccr.V = 1;
00293 mdma_buf_desc[3].ccr.L = 0;
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 mdma_buf_desc[4].src = (U32)((unsigned short *)AVR32_HRAMC0_ADDRESS);
00305 mdma_buf_desc[4].dest = (U32)AVR32_EBI_CS1_0_ADDRESS;
00306 mdma_buf_desc[4].ccr.count = BUFFER_SIZE;
00307 mdma_buf_desc[4].ccr.size = TRANSFERT_SIZE;
00308 mdma_buf_desc[4].ccr.burst_size = BURST_MODE;
00309 mdma_buf_desc[4].ccr.tc_ienable = 1;
00310 mdma_buf_desc[4].ccr.V = 1;
00311 mdma_buf_desc[4].ccr.L = 1;
00312 }
00313
00315 int main(void)
00316 {
00317 int i;
00318 unsigned long noErrors = 0;
00319 volatile unsigned char *sdram = SDRAM;
00320
00321
00322 static const mdma_interrupt_t MDMA_INTERRUPT =
00323 {
00324 .ch0c = 1,
00325 };
00326
00327
00328 init_sys_clocks();
00329
00330
00331 init_usart();
00332
00333
00334 sdramc_init(FPBB_HZ);
00335 print_dbg("SDRAM initialized...\n");
00336
00337 gpio_set_gpio_pin(LED0_GPIO);
00338 gpio_set_gpio_pin(LED1_GPIO);
00339 gpio_set_gpio_pin(LED2_GPIO);
00340 gpio_set_gpio_pin(LED3_GPIO);
00341
00342
00343 mdma_init_buffer_descriptor();
00344
00345 Disable_global_interrupt();
00346
00347
00348 INTC_init_interrupts();
00349
00350
00351 INTC_register_interrupt(&mdma_int_handler, AVR32_MDMA_IRQ, AVR32_INTC_INT0);
00352
00353
00354 Enable_global_interrupt();
00355
00356
00357 mdma_descriptor_mode_xfert_init(mdma,CHANNEL_NBR,(U32*)&mdma_buf_desc);
00358
00359
00360 mdma_configure_interrupts(mdma, &MDMA_INTERRUPT);
00361
00362 print_dbg("MDMA initialized...\n");
00363
00364
00365 for (i=0;i<FLASHC_DATA_BUFFER_SIZE;i++)
00366 {
00367 sdram[i] = 0;
00368 }
00369
00370
00371 mdma_start_descriptor_xfert(mdma,CHANNEL_NBR,MDMA_FIXED_PRIORITY_MODE);
00372
00373 print_dbg("Start MDMA Transfer...\n");
00374
00375
00376 while (mdma_buf_desc[4].ccr.V==1);
00377
00378 print_dbg("End of MDMA Transfer, check transfer on last transfer ...\n");
00379
00380
00381 for (i=0;i<FLASHC_DATA_BUFFER_SIZE;i++)
00382 {
00383 if (sdram[i] != flashc_data[i])
00384 {
00385 noErrors++;
00386 }
00387 }
00388
00389 LED_Off(EXAMPLE_MDMA_LED_READ);
00390 print_dbg_ulong(noErrors);
00391 print_dbg(" corrupted word(s) \n");
00392 if (noErrors)
00393 {
00394 LED_Off(EXAMPLE_MDMA_LED_ERRORS);
00395 while (1)
00396 {
00397 LED_Toggle(EXAMPLE_MDMA_LED_ERRORS);
00398 cpu_delay_ms(200, FOSC0);
00399 }
00400 }
00401 else
00402 {
00403 LED_Off(EXAMPLE_MDMA_LED_OK);
00404 while (1)
00405 {
00406 LED_Toggle(EXAMPLE_MDMA_LED_OK);
00407 cpu_delay_ms(1000, FOSC0);
00408 }
00409 }
00410 }