blob: d4a96b29be4be4436841d7f2df7e54d026a589a0 [file] [log] [blame]
#include <common.h>
#include <exports.h>
#include "flash_local.h"
extern unsigned long __dummy;
extern flash_info_t flash_info[]; /* info for FLASH chips */
void do_reset (void);
void do_updater(void);
void flash_print_info(flash_info_t * info);
static ulong flash_get_size(vu_long * addr, flash_info_t * info);
void _main(void)
{
int i;
printf("\nU-Boot Firmware Updater\n\n");
printf("****************************************************\n");
printf("* ATTENTION!! PLEASE READ THIS NOTICE CAREFULLY! *\n");
printf("****************************************************\n\n");
printf("This program will update your computer's firmware.\n");
printf("Do NOT remove the disk, reset the machine, or do\n");
printf("anything that might disrupt functionality. If this\n");
printf("Program fails, your computer might be unusable, and\n");
printf("you will need to return your board for reflashing.\n");
printf("If you find this too risky, remove the diskette and\n");
printf("switch off your machine now. Otherwise press the \n");
printf("SPACE key now to start the process\n\n");
do
{
char x;
while (!tstc());
x = getc();
if (x == ' ') break;
} while (1);
do_updater();
i = 5;
printf("\nUpdate done. Please remove the cdrom.\n");
printf("You can switch off/reset now when the cdrom is removed\n\n");
/*
printf("The machine will automatically reset in %d seconds\n", i);
while (i)
{
printf("Resetting in %d\r", i);
udelay(1000000);
i--;
}
do_reset();
*/
while (1);
}
void do_updater(void)
{
unsigned long *addr = &__dummy + 65;
//unsigned long flash_size = flash_init();
int rc;
flash_get_size(0xfff80000,&flash_info[0]);
flash_print_info(&flash_info[0]);
flash_sect_protect(0, 0xFFF80000, 0xFFFFFFFF);
printf("\nErasing ");
flash_sect_erase(0xFFF80000, 0xFFFFFFFF);
printf("Writing ");
rc = flash_write((uchar *)addr, 0xFFF80000, 0x80000);
if (rc != 0) printf(" Flashing failed due to error %d\n", rc);
else printf(" done\n");
flash_sect_protect(1, 0xFFF80000, 0xFFFFFFFF);
}