aboutsummaryrefslogtreecommitdiffstats
path: root/roms/u-boot-sam460ex/tools/multiplier/update.c
diff options
context:
space:
mode:
Diffstat (limited to 'roms/u-boot-sam460ex/tools/multiplier/update.c')
-rw-r--r--roms/u-boot-sam460ex/tools/multiplier/update.c129
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;
+}