]>
Commit | Line | Data |
---|---|---|
0b135cfc | 1 | /* |
1a2334a4 | 2 | * Copyright (C) 2007,2008 |
0b135cfc NI |
3 | * Nobuhiro Iwamatsu <iwamatsu@nigauri.org> |
4 | * | |
5 | * This program is free software; you can redistribute it and/or | |
6 | * modify it under the terms of the GNU General Public License as | |
7 | * published by the Free Software Foundation; either version 2 of | |
8 | * the License, or (at your option) any later version. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License | |
16 | * along with this program; if not, write to the Free Software | |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
18 | * MA 02111-1307 USA | |
19 | */ | |
20 | ||
21 | #include <common.h> | |
22 | #include <command.h> | |
23 | #include <malloc.h> | |
52cb4d4f | 24 | #include <stdio_dev.h> |
561858ee | 25 | #include <timestamp.h> |
0b135cfc | 26 | #include <version.h> |
4a065abf | 27 | #include <watchdog.h> |
0b135cfc NI |
28 | #include <net.h> |
29 | #include <environment.h> | |
30 | ||
310cecb8 LCM |
31 | #ifdef CONFIG_BITBANGMII |
32 | #include <miiphy.h> | |
33 | #endif | |
34 | ||
0b135cfc NI |
35 | extern int cpu_init(void); |
36 | extern int board_init(void); | |
37 | extern int dram_init(void); | |
0b135cfc NI |
38 | extern int timer_init(void); |
39 | ||
561858ee | 40 | const char version_string[] = U_BOOT_VERSION" ("U_BOOT_DATE" - "U_BOOT_TIME")"; |
0b135cfc | 41 | |
6d0f6bcf | 42 | unsigned long monitor_flash_len = CONFIG_SYS_MONITOR_LEN; |
0b135cfc | 43 | |
b02bad12 NI |
44 | static int sh_flash_init(void) |
45 | { | |
46 | DECLARE_GLOBAL_DATA_PTR; | |
47 | ||
48 | gd->bd->bi_flashsize = flash_init(); | |
4a065abf | 49 | printf("FLASH: %ldMB\n", gd->bd->bi_flashsize / (1024*1024)); |
b02bad12 NI |
50 | |
51 | return 0; | |
52 | } | |
53 | ||
54 | #if defined(CONFIG_CMD_NAND) | |
4a065abf NI |
55 | # include <nand.h> |
56 | # define INIT_FUNC_NAND_INIT nand_init, | |
57 | #else | |
58 | # define INIT_FUNC_NAND_INIT | |
b02bad12 NI |
59 | #endif /* CONFIG_CMD_NAND */ |
60 | ||
4a065abf NI |
61 | #if defined(CONFIG_WATCHDOG) |
62 | extern int watchdog_init(void); | |
63 | extern int watchdog_disable(void); | |
64 | # define INIT_FUNC_WATCHDOG_INIT watchdog_init, | |
65 | # define WATCHDOG_DISABLE watchdog_disable | |
66 | #else | |
67 | # define INIT_FUNC_WATCHDOG_INIT | |
68 | # define WATCHDOG_DISABLE | |
69 | #endif /* CONFIG_WATCHDOG */ | |
70 | ||
b02bad12 | 71 | #if defined(CONFIG_CMD_IDE) |
4a065abf NI |
72 | # include <ide.h> |
73 | # define INIT_FUNC_IDE_INIT ide_init, | |
74 | #else | |
75 | # define INIT_FUNC_IDE_INIT | |
76 | #endif /* CONFIG_CMD_IDE */ | |
b02bad12 | 77 | |
1a2334a4 | 78 | #if defined(CONFIG_PCI) |
4a065abf | 79 | #include <pci.h> |
1a2334a4 YG |
80 | static int sh_pci_init(void) |
81 | { | |
82 | pci_init(); | |
83 | return 0; | |
84 | } | |
4a065abf NI |
85 | # define INIT_FUNC_PCI_INIT sh_pci_init, |
86 | #else | |
87 | # define INIT_FUNC_PCI_INIT | |
1a2334a4 YG |
88 | #endif /* CONFIG_PCI */ |
89 | ||
b02bad12 NI |
90 | static int sh_mem_env_init(void) |
91 | { | |
a483a167 PT |
92 | mem_malloc_init(TEXT_BASE - CONFIG_SYS_GBL_DATA_SIZE - |
93 | CONFIG_SYS_MALLOC_LEN, CONFIG_SYS_MALLOC_LEN - 16); | |
b02bad12 NI |
94 | env_relocate(); |
95 | jumptable_init(); | |
96 | return 0; | |
97 | } | |
98 | ||
9e23fe05 | 99 | #if defined(CONFIG_CMD_NET) |
b02bad12 NI |
100 | static int sh_net_init(void) |
101 | { | |
102 | DECLARE_GLOBAL_DATA_PTR; | |
b02bad12 | 103 | gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr"); |
b02bad12 NI |
104 | return 0; |
105 | } | |
9e23fe05 | 106 | #endif |
b02bad12 | 107 | |
0b135cfc NI |
108 | typedef int (init_fnc_t) (void); |
109 | ||
110 | init_fnc_t *init_sequence[] = | |
111 | { | |
112 | cpu_init, /* basic cpu dependent setup */ | |
113 | board_init, /* basic board dependent setup */ | |
4a065abf | 114 | interrupt_init, /* set up exceptions */ |
0b135cfc | 115 | env_init, /* event init */ |
4a065abf NI |
116 | serial_init, /* SCIF init */ |
117 | INIT_FUNC_WATCHDOG_INIT /* watchdog init */ | |
0b135cfc NI |
118 | console_init_f, |
119 | display_options, | |
120 | checkcpu, | |
b02bad12 | 121 | checkboard, /* Check support board */ |
0b135cfc | 122 | dram_init, /* SDRAM init */ |
b02bad12 | 123 | timer_init, /* SuperH Timer (TCNT0 only) init */ |
b02bad12 | 124 | sh_mem_env_init, |
c790b04d | 125 | sh_flash_init, /* Flash memory(NOR) init*/ |
4a065abf NI |
126 | INIT_FUNC_NAND_INIT/* Flash memory (NAND) init */ |
127 | INIT_FUNC_PCI_INIT /* PCI init */ | |
52cb4d4f | 128 | stdio_init, |
b02bad12 NI |
129 | console_init_r, |
130 | interrupt_init, | |
131 | #ifdef BOARD_LATE_INIT | |
132 | board_late_init, | |
133 | #endif | |
134 | #if defined(CONFIG_CMD_NET) | |
135 | sh_net_init, /* SH specific eth init */ | |
136 | #endif | |
0b135cfc NI |
137 | NULL /* Terminate this list */ |
138 | }; | |
139 | ||
4a065abf | 140 | void sh_generic_init(void) |
0b135cfc NI |
141 | { |
142 | DECLARE_GLOBAL_DATA_PTR; | |
143 | ||
144 | bd_t *bd; | |
145 | init_fnc_t **init_fnc_ptr; | |
0b135cfc | 146 | |
6d0f6bcf | 147 | memset(gd, 0, CONFIG_SYS_GBL_DATA_SIZE); |
0b135cfc NI |
148 | |
149 | gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ | |
150 | ||
4a065abf | 151 | gd->bd = (bd_t *)(gd + 1); /* At end of global data */ |
0b135cfc NI |
152 | gd->baudrate = CONFIG_BAUDRATE; |
153 | ||
154 | gd->cpu_clk = CONFIG_SYS_CLK_FREQ; | |
155 | ||
156 | bd = gd->bd; | |
6d0f6bcf JCPV |
157 | bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; |
158 | bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE; | |
159 | bd->bi_flashstart = CONFIG_SYS_FLASH_BASE; | |
160 | #if defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE) | |
161 | bd->bi_sramstart = CONFIG_SYS_SRAM_BASE; | |
162 | bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE; | |
0b135cfc NI |
163 | #endif |
164 | bd->bi_baudrate = CONFIG_BAUDRATE; | |
165 | ||
4a065abf NI |
166 | for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { |
167 | WATCHDOG_RESET(); | |
168 | if ((*init_fnc_ptr) () != 0) | |
0b135cfc | 169 | hang(); |
0b135cfc | 170 | } |
0b135cfc | 171 | |
4a065abf NI |
172 | #ifdef CONFIG_WATCHDOG |
173 | /* disable watchdog if environment is set */ | |
174 | { | |
175 | char *s = getenv("watchdog"); | |
176 | if (s != NULL) | |
177 | if (strncmp(s, "off", 3) == 0) | |
178 | WATCHDOG_DISABLE(); | |
179 | } | |
180 | #endif /* CONFIG_WATCHDOG*/ | |
b02bad12 | 181 | |
4a065abf | 182 | |
310cecb8 LCM |
183 | #ifdef CONFIG_BITBANGMII |
184 | bb_miiphy_init(); | |
185 | #endif | |
4a065abf NI |
186 | #if defined(CONFIG_CMD_NET) |
187 | { | |
188 | char *s; | |
189 | puts("Net: "); | |
190 | eth_initialize(gd->bd); | |
191 | ||
192 | s = getenv("bootfile"); | |
193 | if (s != NULL) | |
194 | copy_filename(BootFile, s, sizeof(BootFile)); | |
b02bad12 NI |
195 | } |
196 | #endif /* CONFIG_CMD_NET */ | |
197 | ||
0b135cfc | 198 | while (1) { |
4a065abf | 199 | WATCHDOG_RESET(); |
0b135cfc NI |
200 | main_loop(); |
201 | } | |
202 | } | |
203 | ||
0b135cfc NI |
204 | /***********************************************************************/ |
205 | ||
4a065abf | 206 | void hang(void) |
0b135cfc | 207 | { |
4a065abf NI |
208 | puts("Board ERROR\n"); |
209 | for (;;) | |
210 | ; | |
0b135cfc | 211 | } |