File indexing completed on 2025-05-11 08:23:45
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 #include <bsp.h>
0048
0049 #include <string.h>
0050
0051 #include <bsp/linker-symbols.h>
0052
0053 #if defined(HAS_LOW_LEVEL_INIT)
0054 #define SYSTEM_PERIOD 10
0055
0056
0057 #define SDRAM_TWR 2
0058 #define SDRAM_CASL 2.5
0059 #define SDRAM_TRCD 20
0060 #define SDRAM_TRP 20
0061 #define SDRAM_TRFC 75
0062 #define SDRAM_TREFI 7800
0063 #endif
0064
0065 extern uint8_t _DataRom[];
0066 extern uint8_t _DataRam[];
0067 extern uint8_t _DataEnd[];
0068 extern uint8_t _BssStart[];
0069 extern uint8_t _BssEnd[];
0070 extern uint8_t _BootFlashBase[];
0071 extern uint8_t _CodeFlashBase[];
0072 extern uint8_t RamBase[];
0073
0074 void gpio_init(void);
0075 void fbcs_init(void);
0076 void sdramc_init(void);
0077 void mcf548x_init(void);
0078
0079
0080 void mcf548x_init(void)
0081 {
0082 size_t i;
0083
0084 #if defined(HAS_LOW_LEVEL_INIT)
0085
0086 MCF548X_XLB_ADRTO = 0x00000100;
0087 MCF548X_XLB_DATTO = 0x00000100;
0088 MCF548X_XLB_BUSTO = 0x00000100;
0089 #endif
0090
0091 gpio_init();
0092 #if defined(HAS_LOW_LEVEL_INIT)
0093 fbcs_init();
0094 sdramc_init();
0095 #endif
0096
0097
0098 if (bsp_vector0_size == bsp_vector1_size) {
0099 memcpy(bsp_vector1_begin, bsp_vector0_begin, (size_t) bsp_vector1_size);
0100 m68k_set_vbr((uint32_t)bsp_vector1_begin);
0101 }
0102
0103
0104 if (bsp_section_data_begin != bsp_section_data_load_begin) {
0105 memcpy(
0106 bsp_section_data_begin,
0107 bsp_section_data_load_begin,
0108 (size_t) bsp_section_data_size
0109 );
0110 }
0111
0112
0113 memset(bsp_section_bss_begin, 0, (size_t) bsp_section_bss_size);
0114
0115 for (i = 8; i < RTEMS_ARRAY_SIZE(mcf548x_intc_icr_init_values); ++i) {
0116 volatile uint8_t *icr = &MCF548X_INTC_ICR0;
0117
0118 icr[i] = mcf548x_intc_icr_init_values[i];
0119 }
0120 }
0121
0122 #if defined(HAS_LOW_LEVEL_INIT)
0123 void
0124 fbcs_init (void)
0125 {
0126 #ifdef M5484FIREENGINE
0127
0128 volatile uint32_t cscr, clk_ratio, fb_period, ws;
0129
0130
0131 if(!(MCF548X_FBCS_CSMR0 & MCF548X_FBCS_CSMR_V))
0132 {
0133
0134
0135
0136
0137 MCF548X_FBCS_CSAR0 = MCF548X_FBCS_CSAR_BA((uint32_t)(_BootFlashBase));
0138
0139 cscr = (0
0140 | MCF548X_FBCS_CSCR_ASET(1)
0141 | MCF548X_FBCS_CSCR_WRAH(0)
0142 | MCF548X_FBCS_CSCR_RDAH(0)
0143 | MCF548X_FBCS_CSCR_AA
0144 | MCF548X_FBCS_CSCR_PS_16);
0145
0146
0147
0148
0149
0150
0151 clk_ratio = (MCF548X_PCI_PCIGSCR >> 24) & 0x7;
0152 fb_period = SYSTEM_PERIOD * clk_ratio;
0153 ws = 110 / fb_period;
0154
0155 MCF548X_FBCS_CSCR0 = cscr | MCF548X_FBCS_CSCR_WS(ws);
0156 MCF548X_FBCS_CSMR0 = (0
0157 | MCF548X_FBCS_CSMR_BAM_2M
0158 | MCF548X_FBCS_CSMR_V);
0159
0160 }
0161
0162
0163 if(!(MCF548X_FBCS_CSMR1 & MCF548X_FBCS_CSMR_V))
0164 {
0165
0166
0167
0168
0169 MCF548X_FBCS_CSAR1 = MCF548X_FBCS_CSAR_BA((uint32_t)(_CodeFlashBase));
0170
0171
0172
0173
0174
0175
0176 ws = 120 / fb_period;
0177 MCF548X_FBCS_CSCR1 = cscr | MCF548X_FBCS_CSCR_WS(ws);
0178 MCF548X_FBCS_CSMR1 = (0
0179 | MCF548X_FBCS_CSMR_BAM_16M
0180 | MCF548X_FBCS_CSMR_V);
0181 }
0182
0183 #endif
0184 }
0185 #endif
0186
0187
0188 #if defined(HAS_LOW_LEVEL_INIT)
0189 void
0190 sdramc_init (void)
0191 {
0192
0193
0194
0195
0196
0197 if (!(MCF548X_SDRAMC_SDCR & MCF548X_SDRAMC_SDCR_REF))
0198 {
0199
0200
0201
0202 MCF548X_SDRAMC_SDRAMDS = (0
0203 | MCF548X_SDRAMC_SDRAMDS_SB_E(MCF548X_SDRAMC_SDRAMDS_DRIVE_8MA)
0204 | MCF548X_SDRAMC_SDRAMDS_SB_C(MCF548X_SDRAMC_SDRAMDS_DRIVE_8MA)
0205 | MCF548X_SDRAMC_SDRAMDS_SB_A(MCF548X_SDRAMC_SDRAMDS_DRIVE_8MA)
0206 | MCF548X_SDRAMC_SDRAMDS_SB_S(MCF548X_SDRAMC_SDRAMDS_DRIVE_8MA)
0207 | MCF548X_SDRAMC_SDRAMDS_SB_D(MCF548X_SDRAMC_SDRAMDS_DRIVE_8MA)
0208 );
0209 MCF548X_SDRAMC_CS0CFG = (0
0210 | MCF548X_SDRAMC_CSnCFG_CSBA((uint32_t)(RamBase))
0211 | MCF548X_SDRAMC_CSnCFG_CSSZ(MCF548X_SDRAMC_CSnCFG_CSSZ_64MBYTE)
0212 );
0213 MCF548X_SDRAMC_SDCFG1 = (0
0214 | MCF548X_SDRAMC_SDCFG1_SRD2RW(7)
0215 | MCF548X_SDRAMC_SDCFG1_SWT2RD(SDRAM_TWR + 1)
0216 | MCF548X_SDRAMC_SDCFG1_RDLAT((int)((SDRAM_CASL*2) + 2))
0217 | MCF548X_SDRAMC_SDCFG1_ACT2RW((int)(((SDRAM_TRCD/SYSTEM_PERIOD) - 1) + 0.5))
0218 | MCF548X_SDRAMC_SDCFG1_PRE2ACT((int)(((SDRAM_TRP/SYSTEM_PERIOD) - 1) + 0.5))
0219 | MCF548X_SDRAMC_SDCFG1_REF2ACT((int)(((SDRAM_TRFC/SYSTEM_PERIOD) - 1) + 0.5))
0220 | MCF548X_SDRAMC_SDCFG1_WTLAT(3)
0221 );
0222 MCF548X_SDRAMC_SDCFG2 = (0
0223 | MCF548X_SDRAMC_SDCFG2_BRD2PRE(4)
0224 | MCF548X_SDRAMC_SDCFG2_BWT2RW(6)
0225 | MCF548X_SDRAMC_SDCFG2_BRD2WT(7)
0226 | MCF548X_SDRAMC_SDCFG2_BL(7)
0227 );
0228
0229
0230
0231
0232 MCF548X_SDRAMC_SDCR = (0
0233 | MCF548X_SDRAMC_SDCR_MODE_EN
0234 | MCF548X_SDRAMC_SDCR_CKE
0235 | MCF548X_SDRAMC_SDCR_DDR
0236 | MCF548X_SDRAMC_SDCR_MUX(1)
0237 | MCF548X_SDRAMC_SDCR_RCNT((int)(((SDRAM_TREFI/(SYSTEM_PERIOD*64)) - 1) + 0.5))
0238 | MCF548X_SDRAMC_SDCR_IPALL
0239 );
0240
0241
0242
0243
0244 MCF548X_SDRAMC_SDMR = (0
0245 | MCF548X_SDRAMC_SDMR_BNKAD_LEMR
0246 | MCF548X_SDRAMC_SDMR_AD(0x0)
0247 | MCF548X_SDRAMC_SDMR_CMD
0248 );
0249
0250
0251
0252
0253 MCF548X_SDRAMC_SDMR = (0
0254 | MCF548X_SDRAMC_SDMR_BNKAD_LMR
0255 | MCF548X_SDRAMC_SDMR_AD(0x163)
0256 | MCF548X_SDRAMC_SDMR_CMD
0257 );
0258
0259
0260
0261
0262 MCF548X_SDRAMC_SDCR |=MCF548X_SDRAMC_SDCR_IPALL;
0263
0264
0265
0266
0267 MCF548X_SDRAMC_SDCR |= MCF548X_SDRAMC_SDCR_IREF;
0268 MCF548X_SDRAMC_SDCR |= MCF548X_SDRAMC_SDCR_IREF;
0269
0270
0271
0272
0273 MCF548X_SDRAMC_SDMR = (0
0274 | MCF548X_SDRAMC_SDMR_BNKAD_LMR
0275 | MCF548X_SDRAMC_SDMR_AD(0x063)
0276 | MCF548X_SDRAMC_SDMR_CMD
0277 );
0278
0279
0280
0281
0282 MCF548X_SDRAMC_SDCR &= ~MCF548X_SDRAMC_SDCR_MODE_EN;
0283 MCF548X_SDRAMC_SDCR |= (0
0284 | MCF548X_SDRAMC_SDCR_REF
0285 | MCF548X_SDRAMC_SDCR_DQS_OE(0xF)
0286 );
0287 }
0288
0289 }
0290 #endif
0291
0292
0293 void
0294 gpio_init(void)
0295 {
0296
0297 #ifdef M5484FIREENGINE
0298
0299
0300
0301
0302
0303
0304 MCF548X_GPIO_PAR_FECI2CIRQ = (0
0305
0306 | MCF548X_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_EMDC
0307 | MCF548X_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_EMDIO
0308 | MCF548X_GPIO_PAR_FECI2CIRQ_PAR_E1MII
0309 | MCF548X_GPIO_PAR_FECI2CIRQ_PAR_E17
0310
0311 | MCF548X_GPIO_PAR_FECI2CIRQ_PAR_E0MDC
0312 | MCF548X_GPIO_PAR_FECI2CIRQ_PAR_E0MDIO
0313 | MCF548X_GPIO_PAR_FECI2CIRQ_PAR_E0MII
0314 | MCF548X_GPIO_PAR_FECI2CIRQ_PAR_E07
0315 );
0316
0317 #endif
0318
0319
0320
0321 MCF548X_EPORT_EPIER = 0;
0322 }