File indexing completed on 2025-05-11 08:23:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <bsp.h>
0021
0022
0023 #define MCF_EDMA_TCD_W0(channel) (*(vuint32 *)(0xFC045000+((channel)*0x20)))
0024 #define MCF_EDMA_TCD_W1(channel) (*(vuint32 *)(0xFC045004+((channel)*0x20)))
0025 #define MCF_EDMA_TCD_W2(channel) (*(vuint32 *)(0xFC045008+((channel)*0x20)))
0026 #define MCF_EDMA_TCD_W3(channel) (*(vuint32 *)(0xFC04500C+((channel)*0x20)))
0027 #define MCF_EDMA_TCD_W4(channel) (*(vuint32 *)(0xFC045010+((channel)*0x20)))
0028 #define MCF_EDMA_TCD_W5(channel) (*(vuint32 *)(0xFC045014+((channel)*0x20)))
0029 #define MCF_EDMA_TCD_W6(channel) (*(vuint32 *)(0xFC045018+((channel)*0x20)))
0030 #define MCF_EDMA_TCD_W7(channel) (*(vuint32 *)(0xFC04501C+((channel)*0x20)))
0031
0032
0033 void init_main(void);
0034 static void disable_interrupts(void);
0035 static void disable_watchdog_timer(void);
0036 static void disable_cache(void);
0037 extern void init_clock_config(void) __attribute__ ((section(".ram_code")));
0038 static void init_cache(void);
0039 static void init_crossbar(void);
0040 extern void init_chip_selects(void) __attribute__ ((section(".ram_code")));
0041 static void init_eport(void);
0042 static void init_flexcan(void);
0043 static void init_dma_timers(void);
0044 static void init_interrupt_timers(void);
0045 static void init_real_time_clock(void);
0046 static void init_watchdog_timers(void);
0047 static void init_edma(void);
0048 static void init_pin_assignments(void);
0049 extern void init_sdram_controller(void)
0050 __attribute__ ((section(".ram_code")));
0051 static void init_interrupt_controller(void);
0052
0053
0054
0055
0056 void init_main(void)
0057 {
0058 init_clock_config();
0059
0060
0061 disable_interrupts();
0062 disable_watchdog_timer();
0063 disable_cache();
0064
0065
0066 init_cache();
0067 init_crossbar();
0068 init_chip_selects();
0069 init_eport();
0070 init_flexcan();
0071 init_dma_timers();
0072 init_interrupt_timers();
0073 init_real_time_clock();
0074 init_watchdog_timers();
0075 init_edma();
0076 init_pin_assignments();
0077
0078
0079 init_sdram_controller();
0080
0081
0082 init_interrupt_controller();
0083 }
0084
0085
0086
0087
0088 static void disable_interrupts(void)
0089 {
0090 vuint8 *p;
0091 int i;
0092
0093
0094 p = (vuint8 *) & MCF_INTC0_ICR1;
0095 for (i = 1; i <= 63; i++)
0096 *p++ = 0x0;
0097
0098
0099 p = (vuint8 *) & MCF_INTC1_ICR0;
0100 for (i = 100; i <= 163; i++)
0101 *p++ = 0x0;
0102 }
0103
0104
0105
0106
0107 static void disable_watchdog_timer(void)
0108 {
0109
0110 MCF_SCM_CWCR = 0;
0111 }
0112
0113
0114
0115
0116 static void disable_cache(void)
0117 {
0118 __asm__ ("move.l #0x01000000,%d0");
0119 __asm__ ("movec %d0,%CACR");
0120 }
0121
0122
0123
0124
0125 void init_clock_config(void)
0126 {
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137 if (MCF_SDRAMC_SDCR & MCF_SDRAMC_SDCR_REF)
0138 MCF_SDRAMC_SDCR &= ~MCF_SDRAMC_SDCR_CKE;
0139
0140
0141
0142
0143
0144 MCF_CCM_CDR = (MCF_CCM_CDR & 0xf0ff) | MCF_CCM_CDR_LPDIV(0x2);
0145 MCF_CCM_MISCCR |= MCF_CCM_MISCCR_LIMP;
0146
0147
0148 MCF_PLL_PODR = MCF_PLL_PODR_CPUDIV(0x2) | MCF_PLL_PODR_BUSDIV(0x6);
0149 MCF_PLL_PFDR = MCF_PLL_PFDR_MFD(0x78);
0150 MCF_PLL_PLLCR = 0;
0151 MCF_PLL_PMDR = 0;
0152
0153
0154 MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_LIMP;
0155 while ((MCF_CCM_MISCCR & MCF_CCM_MISCCR_PLL_LOCK) == 0) ;
0156
0157
0158
0159
0160
0161
0162
0163 *(vuint32 *) 0xfc0b8080 = 0x40000000;
0164
0165
0166 if (MCF_SDRAMC_SDCR & MCF_SDRAMC_SDCR_REF)
0167 MCF_SDRAMC_SDCR |= MCF_SDRAMC_SDCR_CKE;
0168 }
0169
0170
0171
0172
0173 static void init_cache(void)
0174 {
0175
0176
0177
0178
0179
0180
0181 #if 0
0182 __asm__ ("move.l #0xa0000600,%d0");
0183 __asm__ ("movec %d0,%CACR");
0184 #endif
0185 __asm__ ("move.l #0x4001c020,%d0");
0186 __asm__ ("movec %d0,%ACR0");
0187 __asm__ ("move.l #0x00000000,%d0");
0188 __asm__ ("movec %d0,%ACR1");
0189 }
0190
0191
0192
0193
0194 static void init_crossbar(void)
0195 {
0196
0197
0198
0199 MCF_XBS_PRS1 = MCF_XBS_PRS_M6(0x5) |
0200 MCF_XBS_PRS_M5(0x4) |
0201 MCF_XBS_PRS_M4(0x1) | MCF_XBS_PRS_M2(0x3) | MCF_XBS_PRS_M1(0x2);
0202 MCF_XBS_CRS1 = 0;
0203
0204
0205
0206
0207 MCF_XBS_PRS4 = MCF_XBS_PRS_M6(0x5) |
0208 MCF_XBS_PRS_M5(0x4) |
0209 MCF_XBS_PRS_M4(0x3) | MCF_XBS_PRS_M2(0x2) | MCF_XBS_PRS_M1(0x1);
0210 MCF_XBS_CRS4 = 0;
0211
0212
0213
0214
0215 MCF_XBS_PRS6 = MCF_XBS_PRS_M6(0x5) |
0216 MCF_XBS_PRS_M5(0x4) |
0217 MCF_XBS_PRS_M4(0x3) | MCF_XBS_PRS_M2(0x2) | MCF_XBS_PRS_M1(0x1);
0218 MCF_XBS_CRS6 = 0;
0219
0220
0221
0222
0223 MCF_XBS_PRS7 = MCF_XBS_PRS_M6(0x5) |
0224 MCF_XBS_PRS_M5(0x4) |
0225 MCF_XBS_PRS_M4(0x3) | MCF_XBS_PRS_M2(0x2) | MCF_XBS_PRS_M1(0x1);
0226 MCF_XBS_CRS7 = 0;
0227 }
0228
0229
0230
0231
0232 void init_chip_selects(void)
0233 {
0234
0235 MCF_FBCS1_CSMR = 0;
0236
0237
0238 MCF_FBCS2_CSMR = 0;
0239
0240
0241 MCF_FBCS3_CSMR = 0;
0242
0243
0244 MCF_FBCS4_CSMR = 0;
0245
0246
0247 MCF_FBCS5_CSMR = 0;
0248
0249
0250
0251
0252
0253
0254
0255 MCF_FBCS0_CSAR = 0;
0256 MCF_FBCS0_CSCR = MCF_FBCS_CSCR_WS(0x7) |
0257 (0x1 << 9) | MCF_FBCS_CSCR_AA | MCF_FBCS_CSCR_PS(0x2) | MCF_FBCS_CSCR_BEM;
0258 MCF_FBCS0_CSMR = MCF_FBCS_CSMR_BAM(0x1f) | MCF_FBCS_CSMR_V;
0259 }
0260
0261
0262
0263
0264 static void init_eport(void)
0265 {
0266
0267 MCF_EPORT_EPPAR = 0;
0268 MCF_EPORT_EPDDR = 0;
0269 MCF_EPORT_EPIER = 0;
0270 }
0271
0272
0273
0274
0275 static void init_flexcan(void)
0276 {
0277
0278 MCF_CAN_IMASK = 0;
0279 MCF_CAN_RXGMASK = MCF_CAN_RXGMASK_MI(0x1fffffff);
0280 MCF_CAN_RX14MASK = MCF_CAN_RX14MASK_MI(0x1fffffff);
0281 MCF_CAN_RX15MASK = MCF_CAN_RX15MASK_MI(0x1fffffff);
0282 MCF_CAN_CANCTRL = 0;
0283 MCF_CAN_CANMCR = MCF_CAN_CANMCR_MDIS |
0284 MCF_CAN_CANMCR_FRZ |
0285 MCF_CAN_CANMCR_HALT | MCF_CAN_CANMCR_SUPV | MCF_CAN_CANMCR_MAXMB(0xf);
0286 }
0287
0288
0289
0290
0291 void init_sdram_controller(void)
0292 {
0293
0294
0295
0296 if (MCF_SDRAMC_SDCR & MCF_SDRAMC_SDCR_REF)
0297 return;
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319 MCF_SDRAMC_SDCS0 = MCF_SDRAMC_SDCS_BASE(0x400) | MCF_SDRAMC_SDCS_CSSZ(0x18);
0320
0321
0322 MCF_SDRAMC_SDCS1 = 0;
0323
0324
0325
0326
0327
0328 MCF_SDRAMC_SDCFG1 = MCF_SDRAMC_SDCFG1_SRD2RW(0x4) |
0329 MCF_SDRAMC_SDCFG1_SWT2RD(0x3) |
0330 MCF_SDRAMC_SDCFG1_RDLAT(0x7) |
0331 MCF_SDRAMC_SDCFG1_ACT2RW(0x2) |
0332 MCF_SDRAMC_SDCFG1_PRE2ACT(0x2) |
0333 MCF_SDRAMC_SDCFG1_REF2ACT(0x6) | MCF_SDRAMC_SDCFG1_WTLAT(0x3);
0334
0335
0336
0337
0338 MCF_SDRAMC_SDCFG2 = MCF_SDRAMC_SDCFG2_BRD2PRE(0x5) |
0339 MCF_SDRAMC_SDCFG2_BWT2RW(0x6) |
0340 MCF_SDRAMC_SDCFG2_BRD2WT(0x6) | MCF_SDRAMC_SDCFG2_BL(0x7);
0341
0342
0343 MCF_SDRAMC_SDCR = MCF_SDRAMC_SDCR_MODE_EN |
0344 MCF_SDRAMC_SDCR_CKE |
0345 MCF_SDRAMC_SDCR_DDR |
0346 MCF_SDRAMC_SDCR_MUX(0x1) |
0347 MCF_SDRAMC_SDCR_RCNT(0x8) | MCF_SDRAMC_SDCR_PS_16 | MCF_SDRAMC_SDCR_IPALL;
0348
0349
0350 MCF_SDRAMC_SDMR = MCF_SDRAMC_SDMR_BNKAD_LEMR | MCF_SDRAMC_SDMR_CMD;
0351
0352
0353 MCF_SDRAMC_SDMR = MCF_SDRAMC_SDMR_BNKAD_LMR |
0354 MCF_SDRAMC_SDMR_AD(0x163) | MCF_SDRAMC_SDMR_CMD;
0355
0356
0357
0358
0359 MCF_SDRAMC_SDCR |= MCF_SDRAMC_SDCR_IPALL;
0360
0361
0362
0363
0364 MCF_SDRAMC_SDCR |= MCF_SDRAMC_SDCR_IREF;
0365 MCF_SDRAMC_SDCR |= MCF_SDRAMC_SDCR_IREF;
0366
0367
0368 MCF_SDRAMC_SDMR = MCF_SDRAMC_SDMR_BNKAD_LMR |
0369 MCF_SDRAMC_SDMR_AD(0x63) | MCF_SDRAMC_SDMR_CMD;
0370
0371
0372 MCF_SDRAMC_SDCR &= ~MCF_SDRAMC_SDCR_MODE_EN;
0373 MCF_SDRAMC_SDCR |= MCF_SDRAMC_SDCR_REF |
0374 MCF_SDRAMC_SDCR_DQS_OE(0x8) | MCF_SDRAMC_SDCR_DQS_OE(0x4);
0375
0376 }
0377
0378
0379
0380
0381 static void init_dma_timers(void)
0382 {
0383
0384 MCF_DTIM0_DTMR = 0;
0385 MCF_DTIM0_DTXMR = 0;
0386 MCF_DTIM0_DTRR = MCF_DTIM_DTRR_REF(0xffffffff);
0387
0388
0389 MCF_DTIM1_DTMR = 0;
0390 MCF_DTIM1_DTXMR = 0;
0391 MCF_DTIM1_DTRR = MCF_DTIM_DTRR_REF(0xffffffff);
0392
0393
0394 MCF_DTIM2_DTMR = 0;
0395 MCF_DTIM2_DTXMR = 0;
0396 MCF_DTIM2_DTRR = MCF_DTIM_DTRR_REF(0xffffffff);
0397
0398
0399 MCF_DTIM3_DTMR = 0;
0400 MCF_DTIM3_DTXMR = 0;
0401 MCF_DTIM3_DTRR = MCF_DTIM_DTRR_REF(0xffffffff);
0402 }
0403
0404
0405
0406
0407 static void init_interrupt_timers(void)
0408 {
0409
0410 MCF_PIT0_PCSR = 0;
0411
0412
0413 MCF_PIT1_PCSR = 0;
0414
0415
0416 MCF_PIT2_PCSR = 0;
0417
0418
0419 MCF_PIT3_PCSR = 0;
0420 }
0421
0422
0423
0424
0425 static void init_real_time_clock(void)
0426 {
0427
0428 MCF_RTC_CR = 0;
0429 }
0430
0431
0432
0433
0434 static void init_watchdog_timers(void)
0435 {
0436
0437
0438
0439
0440 MCF_WTM_WCR = MCF_WTM_WCR_WAIT | MCF_WTM_WCR_DOZE | MCF_WTM_WCR_HALTED;
0441 MCF_WTM_WMR = MCF_WTM_WMR_WM(0xffff);
0442
0443
0444 MCF_SCM_CWCR = MCF_SCM_CWCR_CWT(0x8);
0445 }
0446
0447
0448
0449
0450 static void init_edma(void)
0451 {
0452
0453 MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_TIM_DMA;
0454
0455
0456 MCF_EDMA_CR = MCF_EDMA_CR_ERCA;
0457
0458
0459 MCF_EDMA_EEI = 0;
0460
0461
0462 MCF_EDMA_ERQ = 0;
0463 }
0464
0465
0466
0467
0468 static void init_interrupt_controller(void)
0469 {
0470
0471 MCF_INTC1_ICR0 = 0;
0472 MCF_INTC1_ICR1 = 0;
0473 MCF_INTC1_ICR3 = 0;
0474 MCF_INTC1_ICR4 = 0;
0475 MCF_INTC1_ICR5 = 0;
0476 MCF_INTC1_ICR6 = 0;
0477 MCF_INTC1_ICR7 = 0;
0478 MCF_INTC1_ICR8 = 0;
0479 MCF_INTC1_ICR9 = 0;
0480 MCF_INTC1_ICR10 = 0;
0481 MCF_INTC1_ICR11 = 0;
0482 MCF_INTC1_ICR12 = 0;
0483 MCF_INTC1_ICR13 = 0;
0484 MCF_INTC1_ICR14 = 0;
0485 MCF_INTC1_ICR15 = 0;
0486 MCF_INTC1_ICR16 = 0;
0487 MCF_INTC1_ICR17 = 0;
0488 MCF_INTC1_ICR18 = 0;
0489 MCF_INTC1_ICR19 = 0;
0490 MCF_INTC1_ICR40 = 0;
0491 MCF_INTC1_ICR41 = 0;
0492 MCF_INTC1_ICR42 = 0;
0493 MCF_INTC1_ICR43 = 0;
0494 MCF_INTC1_ICR44 = 0;
0495 MCF_INTC1_ICR45 = 0;
0496 MCF_INTC1_ICR46 = 0;
0497 MCF_INTC1_ICR47 = 0;
0498 MCF_INTC1_ICR48 = 0;
0499 MCF_INTC1_ICR49 = 0;
0500 MCF_INTC1_ICR50 = 0;
0501 MCF_INTC1_ICR51 = 0;
0502 MCF_INTC1_ICR52 = 0;
0503 MCF_INTC1_ICR53 = 0;
0504 MCF_INTC0_ICR1 = 0;
0505 MCF_INTC0_ICR2 = 0;
0506 MCF_INTC0_ICR3 = 0;
0507 MCF_INTC0_ICR4 = 0;
0508 MCF_INTC0_ICR5 = 0;
0509 MCF_INTC0_ICR6 = 0;
0510 MCF_INTC0_ICR7 = 0;
0511 MCF_INTC0_ICR8 = 0;
0512 MCF_INTC0_ICR9 = 0;
0513 MCF_INTC0_ICR10 = 0;
0514 MCF_INTC0_ICR11 = 0;
0515 MCF_INTC0_ICR12 = 0;
0516 MCF_INTC0_ICR13 = 0;
0517 MCF_INTC0_ICR14 = 0;
0518 MCF_INTC0_ICR15 = 0;
0519 MCF_INTC0_ICR16 = 0;
0520 MCF_INTC0_ICR17 = 0;
0521 MCF_INTC0_ICR18 = 0;
0522 MCF_INTC0_ICR19 = 0;
0523 MCF_INTC0_ICR20 = 0;
0524 MCF_INTC0_ICR21 = 0;
0525 MCF_INTC0_ICR22 = 0;
0526 MCF_INTC0_ICR23 = 0;
0527 MCF_INTC0_ICR24 = 0;
0528 MCF_INTC0_ICR25 = 0;
0529 MCF_INTC0_ICR26 = 0;
0530 MCF_INTC0_ICR27 = 0;
0531 MCF_INTC0_ICR28 = 0;
0532 MCF_INTC0_ICR30 = 0;
0533 MCF_INTC0_ICR31 = 0;
0534 MCF_INTC0_ICR32 = 0;
0535 MCF_INTC0_ICR33 = 0;
0536 MCF_INTC0_ICR34 = 0;
0537 MCF_INTC0_ICR35 = 0;
0538 MCF_INTC0_ICR36 = 0;
0539 MCF_INTC0_ICR37 = 0;
0540 MCF_INTC0_ICR38 = 0;
0541 MCF_INTC0_ICR39 = 0;
0542 MCF_INTC0_ICR40 = 0;
0543 MCF_INTC0_ICR41 = 0;
0544 MCF_INTC0_ICR42 = 0;
0545 MCF_INTC0_ICR43 = 0;
0546 MCF_INTC0_ICR44 = 0;
0547 MCF_INTC0_ICR45 = 0;
0548 MCF_INTC0_ICR46 = 0;
0549 MCF_INTC0_ICR47 = 0;
0550 MCF_INTC0_ICR48 = 0;
0551 MCF_INTC0_ICR62 = 0;
0552 MCF_INTC0_IMRH = 0xffffffff;
0553 MCF_INTC0_IMRL = 0xffffffff;
0554 MCF_INTC1_IMRH = 0xffffffff;
0555 MCF_INTC1_IMRL = 0xffffffff;
0556 }
0557
0558
0559
0560
0561 static void init_pin_assignments(void)
0562 {
0563
0564
0565
0566
0567
0568
0569 MCF_GPIO_PDDR_BUSCTL = 0;
0570 MCF_GPIO_PAR_BUSCTL = MCF_GPIO_PAR_BUSCTL_PAR_OE |
0571 MCF_GPIO_PAR_BUSCTL_PAR_TA |
0572 MCF_GPIO_PAR_BUSCTL_PAR_RWB | MCF_GPIO_PAR_BUSCTL_PAR_TS(0x3);
0573
0574
0575
0576
0577
0578
0579
0580 MCF_GPIO_PDDR_BE = 0;
0581 MCF_GPIO_PAR_BE = MCF_GPIO_PAR_BE_PAR_BE3 |
0582 MCF_GPIO_PAR_BE_PAR_BE2 |
0583 MCF_GPIO_PAR_BE_PAR_BE1 | MCF_GPIO_PAR_BE_PAR_BE0;
0584
0585
0586
0587
0588
0589
0590
0591
0592 MCF_GPIO_PDDR_CS = 0;
0593 MCF_GPIO_PAR_CS = MCF_GPIO_PAR_CS_PAR_CS5 |
0594 MCF_GPIO_PAR_CS_PAR_CS4 |
0595 MCF_GPIO_PAR_CS_PAR_CS3 |
0596 MCF_GPIO_PAR_CS_PAR_CS2 | MCF_GPIO_PAR_CS_PAR_CS1;
0597
0598
0599
0600
0601
0602
0603
0604 MCF_GPIO_PDDR_FECI2C = 0;
0605 MCF_GPIO_PAR_FECI2C = MCF_GPIO_PAR_FECI2C_PAR_MDC(0x3) |
0606 MCF_GPIO_PAR_FECI2C_PAR_MDIO(0x3);
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626 MCF_GPIO_PDDR_FECH = 0;
0627 MCF_GPIO_PDDR_FECL = 0;
0628 MCF_GPIO_PAR_FEC = MCF_GPIO_PAR_FEC_PAR_FEC_7W(0x3) |
0629 MCF_GPIO_PAR_FEC_PAR_FEC_MII(0x3);
0630
0631
0632
0633
0634 MCF_GPIO_PAR_IRQ = 0;
0635
0636
0637
0638
0639 MCF_GPIO_PDDR_LCDDATAH = 0;
0640 MCF_GPIO_PAR_LCDDATA = 0;
0641
0642
0643
0644
0645 MCF_GPIO_PDDR_LCDDATAM = 0;
0646
0647
0648
0649
0650 MCF_GPIO_PDDR_LCDDATAL = 0;
0651
0652
0653
0654
0655 MCF_GPIO_PDDR_LCDCTLH = 0;
0656 MCF_GPIO_PAR_LCDCTL = 0;
0657
0658
0659
0660
0661 MCF_GPIO_PDDR_LCDCTLL = 0;
0662
0663
0664
0665
0666 MCF_GPIO_PDDR_PWM = 0;
0667 MCF_GPIO_PAR_PWM = 0;
0668
0669
0670
0671
0672 MCF_GPIO_PDDR_QSPI = 0;
0673 MCF_GPIO_PAR_QSPI = 0;
0674
0675
0676
0677
0678 MCF_GPIO_PDDR_SSI = 0;
0679 MCF_GPIO_PAR_SSI = 0;
0680
0681
0682
0683
0684 MCF_GPIO_PDDR_TIMER = MCF_GPIO_PDDR_TIMER_PDDR_TIMER3 |
0685 MCF_GPIO_PDDR_TIMER_PDDR_TIMER2 |
0686 MCF_GPIO_PDDR_TIMER_PDDR_TIMER1 | MCF_GPIO_PDDR_TIMER_PDDR_TIMER0;
0687 MCF_GPIO_PAR_TIMER = 0;
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699 MCF_GPIO_PDDR_UART = 0;
0700 MCF_GPIO_PAR_UART = MCF_GPIO_PAR_UART_PAR_UCTS1(0x3) |
0701 MCF_GPIO_PAR_UART_PAR_URTS1(0x3) |
0702 MCF_GPIO_PAR_UART_PAR_URXD1(0x3) |
0703 MCF_GPIO_PAR_UART_PAR_UTXD1(0x3) |
0704 MCF_GPIO_PAR_UART_PAR_UCTS0 |
0705 MCF_GPIO_PAR_UART_PAR_URTS0 |
0706 MCF_GPIO_PAR_UART_PAR_URXD0 | MCF_GPIO_PAR_UART_PAR_UTXD0;
0707 }