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