3 * Stefan Roese, DENX Software Engineering, sr@denx.de.
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
27 #include <environment.h>
31 #include <asm/processor.h>
33 #include <asm/ppc4xx-gpio.h>
35 DECLARE_GLOBAL_DATA_PTR;
37 #define REBOOT_MAGIC 0x07081967
38 #define REBOOT_NOP 0x00000000
39 #define REBOOT_DO_POST 0x00000001
41 extern flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* info for FLASH chips */
43 ulong flash_get_size(ulong base, int banknum);
44 void env_crc_update(void);
46 static u32 start_time;
48 int board_early_init_f(void)
50 mtdcr(UIC0SR, 0xFFFFFFFF); /* clear all ints */
51 mtdcr(UIC0ER, 0x00000000); /* disable all ints */
52 mtdcr(UIC0CR, 0x00000000);
53 mtdcr(UIC0PR, 0xFFFF7F00); /* set int polarities */
54 mtdcr(UIC0TR, 0x00000000); /* set int trigger levels */
55 mtdcr(UIC0SR, 0xFFFFFFFF); /* clear all ints */
56 mtdcr(UIC0VCR, 0x00000001); /* set vect base=0,INT0 highest priority */
59 * Configure CPC0_PCI to enable PerWE as output
61 mtdcr(CPC0_PCI, CPC0_PCI_SPE);
73 post_magic = in_be32((void *)CONFIG_SYS_POST_MAGIC);
74 post_val = in_be32((void *)CONFIG_SYS_POST_VAL);
75 if ((post_magic == REBOOT_MAGIC) && (post_val == REBOOT_DO_POST)) {
77 * Set special bootline bootparameter to pass this POST boot
78 * mode to Linux to reset the username/password
80 setenv("addmisc", "setenv bootargs \\${bootargs} factory_reset=yes");
83 * Normally don't run POST tests, only when enabled
84 * via the sw-reset button. So disable further tests
85 * upon next bootup here.
87 out_be32((void *)CONFIG_SYS_POST_VAL, REBOOT_NOP);
90 * Only run POST when initiated via the sw-reset button mechanism
98 start_time = get_timer(0);
104 /* Re-do sizing to get full correct info */
106 /* adjust flash start and offset */
108 switch (gd->bd->bi_flashsize) {
134 pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17);
138 * Re-check to get correct base address
140 flash_get_size(gd->bd->bi_flashstart, 0);
142 /* Monitor protection ON by default */
143 (void)flash_protect(FLAG_PROTECT_SET,
144 -CONFIG_SYS_MONITOR_LEN,
148 /* Env protection ON by default */
149 (void)flash_protect(FLAG_PROTECT_SET,
150 CONFIG_ENV_ADDR_REDUND,
151 CONFIG_ENV_ADDR_REDUND + 2*CONFIG_ENV_SECT_SIZE - 1,
158 * Check Board Identity:
163 int i = getenv_f("serial#", buf, sizeof(buf));
165 puts("Board: Zeus-");
167 if (in_be32((void *)GPIO0_IR) & GPIO_VAL(CONFIG_SYS_GPIO_ZEUS_PE))
172 puts(" of BulletEndPoint");
181 gpio_write_bit(CONFIG_SYS_GPIO_LED_RED, 0);
182 gpio_write_bit(CONFIG_SYS_GPIO_LED_GREEN, 0);
185 gpio_write_bit(CONFIG_SYS_GPIO_LED_RED, 1);
186 gpio_write_bit(CONFIG_SYS_GPIO_LED_GREEN, 1);
191 static int default_env_var(char *buf, char *var)
199 ptr = strstr(buf + 4, var);
201 printf("ERROR: %s not found!\n", var);
204 ptr += strlen(var) + 1;
207 * Now the ethaddr needs to be updated in the "normal"
208 * environment storage -> redundant flash.
212 printf("Updated %s from eeprom to %s!\n", var, val);
217 static int restore_default(void)
228 * Read board specific values from I2C EEPROM
229 * and set env variables accordingly
230 * -> ethaddr, eth1addr, serial#
232 buf = buf_save = malloc(FACTORY_RESET_ENV_SIZE);
234 printf("ERROR: malloc() failed\n");
237 if (eeprom_read(FACTORY_RESET_I2C_EEPROM, FACTORY_RESET_ENV_OFFS,
238 (u8 *)buf, FACTORY_RESET_ENV_SIZE)) {
239 puts("\nError reading EEPROM!\n");
241 crc = crc32(0, (u8 *)(buf + 4), FACTORY_RESET_ENV_SIZE - 4);
242 if (crc != *(u32 *)buf) {
243 printf("ERROR: crc mismatch %08x %08x\n", crc, *(u32 *)buf);
247 default_env_var(buf, "ethaddr");
249 default_env_var(buf, "eth1addr");
251 default_env_var(buf, "serial#");
255 * Finally save updated env variables back to flash
264 int do_set_default(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
277 buf = buf_save = malloc(FACTORY_RESET_ENV_SIZE);
278 memset(buf, 0, FACTORY_RESET_ENV_SIZE);
280 strcpy(var, "ethaddr");
281 printf("Setting %s to %s\n", var, argv[1]);
282 sprintf(str, "%s=%s", var, argv[1]);
283 strcpy(buf + 4, str);
284 buf += strlen(str) + 1;
286 strcpy(var, "eth1addr");
287 printf("Setting %s to %s\n", var, argv[2]);
288 sprintf(str, "%s=%s", var, argv[2]);
289 strcpy(buf + 4, str);
290 buf += strlen(str) + 1;
292 strcpy(var, "serial#");
293 printf("Setting %s to %s\n", var, argv[3]);
294 sprintf(str, "%s=%s", var, argv[3]);
295 strcpy(buf + 4, str);
297 crc = crc32(0, (u8 *)(buf_save + 4), FACTORY_RESET_ENV_SIZE - 4);
298 *(u32 *)buf_save = crc;
300 if (eeprom_write(FACTORY_RESET_I2C_EEPROM, FACTORY_RESET_ENV_OFFS,
301 (u8 *)buf_save, FACTORY_RESET_ENV_SIZE)) {
302 puts("\nError writing EEPROM!\n");
312 setdef, 4, 1, do_set_default,
313 "write board-specific values to EEPROM (ethaddr...)",
314 "ethaddr eth1addr serial#\n - write board-specific values to EEPROM"
317 static inline int sw_reset_pressed(void)
319 return !(in_be32((void *)GPIO0_IR) & GPIO_VAL(CONFIG_SYS_GPIO_SW_RESET));
322 int do_chkreset(cmd_tbl_t* cmdtp, int flag, int argc, char * const argv[])
327 int factory_reset = 0;
329 if (!sw_reset_pressed()) {
330 printf("SW-Reset already high (Button released)\n");
331 printf("-> No action taken!\n");
335 printf("Waiting for SW-Reset button to be released.");
338 delta = get_timer(start_time);
339 if (!sw_reset_pressed())
342 if ((delta > CONFIG_SYS_TIME_POST) && !post) {
343 printf("\nWhen released now, POST tests will be started.");
344 gpio_write_bit(CONFIG_SYS_GPIO_LED_GREEN, 0);
348 if ((delta > CONFIG_SYS_TIME_FACTORY_RESET) && !factory_reset) {
349 printf("\nWhen released now, factory default values"
350 " will be restored.");
351 gpio_write_bit(CONFIG_SYS_GPIO_LED_RED, 0);
356 if (!(count++ % 1000))
361 printf("\nSW-Reset Button released after %d milli-seconds!\n", delta);
363 if (delta > CONFIG_SYS_TIME_FACTORY_RESET) {
364 printf("Starting factory reset value restoration...\n");
367 * Restore default setting
372 * Reset the board for default to become valid
374 do_reset(NULL, 0, 0, NULL);
379 if (delta > CONFIG_SYS_TIME_POST) {
380 printf("Starting POST configuration...\n");
383 * Enable POST upon next bootup
385 out_be32((void *)CONFIG_SYS_POST_MAGIC, REBOOT_MAGIC);
386 out_be32((void *)CONFIG_SYS_POST_VAL, REBOOT_DO_POST);
387 post_bootmode_init();
390 * Reset the logbuffer for a clean start
394 do_reset(NULL, 0, 0, NULL);
403 chkreset, 1, 1, do_chkreset,
404 "Check for status of SW-reset button and act accordingly",
408 #if defined(CONFIG_POST)
410 * Returns 1 if keys pressed to start the power-on long-running tests
411 * Called from board_init_f().
413 int post_hotkeys_pressed(void)
418 post_magic = in_be32((void *)CONFIG_SYS_POST_MAGIC);
419 post_val = in_be32((void *)CONFIG_SYS_POST_VAL);
421 if ((post_magic == REBOOT_MAGIC) && (post_val == REBOOT_DO_POST))
426 #endif /* CONFIG_POST */