129 lines
3.3 KiB
C
129 lines
3.3 KiB
C
#include <common.h>
|
|
#include <exports.h>
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
extern unsigned long __dummy;
|
|
|
|
int do_updater(void);
|
|
|
|
void _main(void)
|
|
{
|
|
char *version = getenv("ver");
|
|
|
|
if (!version)
|
|
{
|
|
printf("\nAttention ! You need first to update U-Boot to version 2010.06.02 !!!\n\n");
|
|
return;
|
|
}
|
|
|
|
if (strcmp(version,"U-Boot 2010.06.02 (Dec 31 2010 - 11:14:01)") != 0)
|
|
{
|
|
printf("\nAttention ! You need first to update U-Boot to version 2010.06.02 !!!\n\n");
|
|
return;
|
|
}
|
|
|
|
printf("\n------ Sam460ex Hardware Configuration Updater -----\n\n");
|
|
|
|
printf("****************************************************\n");
|
|
printf("* ATTENTION!! PLEASE READ THIS NOTICE CAREFULLY! *\n");
|
|
printf("****************************************************\n\n");
|
|
printf("This program will update your Sam460 configuration\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);
|
|
|
|
int ret = do_updater();
|
|
|
|
if (ret == 0)
|
|
{
|
|
printf("\nUpdate done. Please remove the cdrom.\n");
|
|
printf("You can switch off/reset now when the cdrom is removed\n\n");
|
|
|
|
while (1);
|
|
}
|
|
else
|
|
{
|
|
printf("\nUnable to update the hardware configuration\n");
|
|
printf("Please contact support@acube-systems.com to\n");
|
|
printf("correct the problem\n\n");
|
|
}
|
|
}
|
|
|
|
int do_updater(void)
|
|
{
|
|
int ii;
|
|
unsigned char arr[16] = { 0 };
|
|
unsigned char bkp[16] = { 0 };
|
|
unsigned char upd[8] = { 0x86, 0x86, 0xb5, 0x19, 0xb9, 0x85, 0x00, 0x00 };
|
|
bd_t *bd = gd->bd;
|
|
|
|
// read 16 bytes of the boot eeprom --------------------------------------
|
|
|
|
puts("Now reading hardware configuration registers...\n");
|
|
i2c_read(0x52, 0x00, 1, &arr, 16);
|
|
for (ii=0;ii<16;ii++)
|
|
printf ("%02x ",arr[ii]);
|
|
puts("\n\n");
|
|
|
|
// backup 16 bytes of the boot eeprom ------------------------------------
|
|
|
|
puts("Now creating backup... ");
|
|
i2c_write(0x53, 0x00, 1, &arr, 16);
|
|
udelay(100000);
|
|
puts("Done\n");
|
|
|
|
// checking backup -------------------------------------------------------
|
|
|
|
puts("Checking backup... ");
|
|
i2c_read(0x53, 0x00, 1, &bkp, 16);
|
|
udelay(100000);
|
|
for (ii=0;ii<16;ii++)
|
|
{
|
|
if (arr[ii] != bkp[ii]) break;
|
|
}
|
|
|
|
if (ii < 16)
|
|
{
|
|
puts("\nUnable to create a backup... abort\n");
|
|
return 1;
|
|
}
|
|
puts("Done\n");
|
|
|
|
// change config ---------------------------------------------------------
|
|
|
|
puts("Writing new config... ");
|
|
i2c_write(0x52, 0x00, 1, &upd, 8);
|
|
puts("Done\n");
|
|
|
|
// check new config ------------------------------------------------------
|
|
|
|
puts("Checking new config... ");
|
|
i2c_read(0x52, 0x00, 1, &bkp, 8);
|
|
udelay(100000);
|
|
for (ii=0;ii<8;ii++)
|
|
{
|
|
if (upd[ii] != bkp[ii]) break;
|
|
}
|
|
|
|
if (ii < 8)
|
|
{
|
|
puts("\nError verifing new config... abort\n");
|
|
return 1;
|
|
}
|
|
puts("Done\n");
|
|
|
|
return 0;
|
|
}
|