hc
2023-08-30 862c27fc9920c83318c784bfdadf43a65df1ec8f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 * (C) Copyright 2000-2003
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * Copyright (C) 2004-2007, 2012 Freescale Semiconductor, Inc.
 * Hayden Fraser (Hayden.Fraser@freescale.com)
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#include <common.h>
#include <asm/immap.h>
#include <asm/io.h>
 
DECLARE_GLOBAL_DATA_PTR;
 
int checkboard(void)
{
   puts("Board: ");
   puts("Freescale MCF5253 EVBE\n");
   return 0;
};
 
int dram_init(void)
{
   /*
    * Check to see if the SDRAM has already been initialized
    * by a run control tool
    */
   if (!(mbar_readLong(MCFSIM_DCR) & 0x8000)) {
       u32 RC, dramsize;
 
       RC = (CONFIG_SYS_CLK / 1000000) >> 1;
       RC = (RC * 15) >> 4;
 
       /* Initialize DRAM Control Register: DCR */
       mbar_writeShort(MCFSIM_DCR, (0x8400 | RC));
       asm("nop");
 
       mbar_writeLong(MCFSIM_DACR0, 0x00002320);
       asm("nop");
 
       /* Initialize DMR0 */
       dramsize = ((CONFIG_SYS_SDRAM_SIZE << 20) - 1) & 0xFFFC0000;
       mbar_writeLong(MCFSIM_DMR0, dramsize | 1);
       asm("nop");
 
       mbar_writeLong(MCFSIM_DACR0, 0x00002328);
       asm("nop");
 
       /* Write to this block to initiate precharge */
       *(u32 *) (CONFIG_SYS_SDRAM_BASE) = 0xa5a5a5a5;
       asm("nop");
 
       /* Set RE bit in DACR */
       mbar_writeLong(MCFSIM_DACR0,
                  mbar_readLong(MCFSIM_DACR0) | 0x8000);
       asm("nop");
 
       /* Wait for at least 8 auto refresh cycles to occur */
       udelay(500);
 
       /* Finish the configuration by issuing the MRS */
       mbar_writeLong(MCFSIM_DACR0,
                  mbar_readLong(MCFSIM_DACR0) | 0x0040);
       asm("nop");
 
       *(u32 *) (CONFIG_SYS_SDRAM_BASE + 0x800) = 0xa5a5a5a5;
   }
 
   gd->ram_size = CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
 
   return 0;
}
 
int testdram(void)
{
   /* TODO: XXX XXX XXX */
   printf("DRAM test not implemented!\n");
 
   return (0);
}
 
#ifdef CONFIG_IDE
#include <ata.h>
int ide_preinit(void)
{
   return (0);
}
 
void ide_set_reset(int idereset)
{
   atac_t *ata = (atac_t *) CONFIG_SYS_ATA_BASE_ADDR;
   long period;
   /*  t1,  t2,  t3,  t4,  t5,  t6,  t9, tRD,  tA */
   int piotms[5][9] = { {70, 165, 60, 30, 50, 5, 20, 0, 35},    /* PIO 0 */
   {50, 125, 45, 20, 35, 5, 15, 0, 35},    /* PIO 1 */
   {30, 100, 30, 15, 20, 5, 10, 0, 35},    /* PIO 2 */
   {30, 80, 30, 10, 20, 5, 10, 0, 35},    /* PIO 3 */
   {25, 70, 20, 10, 20, 5, 10, 0, 35}    /* PIO 4 */
   };
 
   if (idereset) {
       /* control reset */
       out_8(&ata->cr, 0);
       udelay(100);
   } else {
       mbar2_writeLong(CIM_MISCCR, CIM_MISCCR_CPUEND);
 
#define CALC_TIMING(t) (t + period - 1) / period
       period = 1000000000 / (CONFIG_SYS_CLK / 2);    /* period in ns */
 
       /*ata->ton = CALC_TIMING (180); */
       out_8(&ata->t1, CALC_TIMING(piotms[2][0]));
       out_8(&ata->t2w, CALC_TIMING(piotms[2][1]));
       out_8(&ata->t2r, CALC_TIMING(piotms[2][1]));
       out_8(&ata->ta, CALC_TIMING(piotms[2][8]));
       out_8(&ata->trd, CALC_TIMING(piotms[2][7]));
       out_8(&ata->t4, CALC_TIMING(piotms[2][3]));
       out_8(&ata->t9, CALC_TIMING(piotms[2][6]));
 
       /* IORDY enable */
       out_8(&ata->cr, 0x40);
       udelay(2000);
       /* IORDY enable */
       setbits_8(&ata->cr, 0x01);
   }
}
#endif                /* CONFIG_IDE */