diff options
Diffstat (limited to 'roms/u-boot-sam460ex/tools/multiplier/update.c')
-rw-r--r-- | roms/u-boot-sam460ex/tools/multiplier/update.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/roms/u-boot-sam460ex/tools/multiplier/update.c b/roms/u-boot-sam460ex/tools/multiplier/update.c new file mode 100644 index 000000000..876889792 --- /dev/null +++ b/roms/u-boot-sam460ex/tools/multiplier/update.c @@ -0,0 +1,129 @@ +#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; +} |