I'm implementing a rather complex boot that involves flags and counters in EEPROM.
This is to detect multiple boot failures and to then revert to a previous Linux kernel and sysroot. The Hush shell and applications almost support this by using scripts (even autoscripting), but not quite. "ee read" and "ee write" let me read and write the counters and flags to memory. From there, "if itest *$buf_addr == 1" (and so on) can be used to test the values of flags in the EEPROM (except for bad bug in itest, listed later). "mw.b" can write flags into memory to then be written to eeprom. The only way I can currently think of to "read" a byte from EEPROM into a shell variable so it can be decremented (with setexpr) and then written back is to use something like the following: READ_ADDR=0x82000000 setenv FN_READ_BYTE 'setenv DATA; DATA=0; while itest \ *$READ_ADDR != $DATA; do setexp DATA $DATA + 1; done' mw.l 0x82000000 254 run FN_READ_BYTE echo $DATA Yes, it is comparing every value from zero and incrementing until it gets a match! That results in $DATA being set to "254" (the value I wrote to memory) but it takes 9 seconds to run on an 800MHz ARM core! Am I missing a simpler way or am I going to have to add some new commands, like a "memory read" variant that reads into an environment variable. If setexpr took a "*" to be a pointer (to be consistent with itest) it might be the easiest addition. BUG IN ITEST ------------ itest crashes ARM chips. I can "iread.b *82000000 == 0", but "iread.b *82000001 == 0" throws an alignment exception that kills the box. The code in itest.c is: static long evalexp(char *s, int w) { long l, *p; /* if the parameter starts with a * then assume is a pointer to the value we want */ if (s[0] == '*') { p = (long *)simple_strtoul(&s[1], NULL, 16); l = *p; } else { l = simple_strtoul(s, NULL, 16); } return (l & ((1 << (w * 8)) - 1)); } "l = *p" works on a 486 but not on an ARM. It is a simple change - a three-way case on the width reading through the "right pointer". Yes, I should fix this and submit a patch, but I'm not working on anything close to the distribution tree unfortunately. I'm pretty sure this hasn't been fixed lately though. -- === Tom Evans tom.ev...@ceos.com.au CEOS Pty Ltd www.ceos.com.au 3/17 Burgundy St, Heidelberg, Victoria 3084, Australia _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot