VoiceBlue update: eeprom tool can also store firmware version now.
authorWolfgang Denk <wd@pollux.denx.de>
Fri, 12 Aug 2005 20:56:51 +0000 (22:56 +0200)
committerWolfgang Denk <wd@pollux.denx.de>
Fri, 12 Aug 2005 20:56:51 +0000 (22:56 +0200)
eeprom.bin is runable by jumping at load address.
Patch by Ladislav Michl, 23 May 2005

CHANGELOG
board/voiceblue/Makefile
board/voiceblue/eeprom.c

index 8173a65ce8e88216f2f3562870fc3841f97aaaf0..249905f2fb2bb4696e2df117dc6a73dec89874f8 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,10 @@
 Changes for U-Boot 1.1.3:
 ======================================================================
 
+* VoiceBlue update: eeprom tool can also store firmware version now.
+  eeprom.bin is runable by jumping at load address.
+  Patch by Ladislav Michl, 23 May 2005
+
 * Move the AT91RM9200DK to the ARM Systems list.
   Patch by Anders Larsen, 26 Apr 2005
   
index 44be6ca898184be8bb646fb48beeee41efece4b3..3b3e5239e635956b7778bcecf87911deb6e5195c 100644 (file)
@@ -32,21 +32,23 @@ SOBJS       := setup.o
 gcclibdir := $(shell dirname `$(CC) -print-libgcc-file-name`)
 
 LOAD_ADDR = 0x10400000
+LDSCRIPT = $(TOPDIR)/board/$(BOARDDIR)/eeprom.lds 
 
 all:   $(LIB) eeprom.srec eeprom.bin
 
 $(LIB):        $(OBJS) $(SOBJS)
        $(AR) crv $@ $(OBJS) $(SOBJS)
 
-eeprom.srec:   eeprom.o
-       $(LD) -g -Ttext $(LOAD_ADDR) -o $(<:.o=) -e $(<:.o=) $^ \
+eeprom.srec:   eeprom.o eeprom_start.o
+       $(LD) -T $(LDSCRIPT) -g -Ttext $(LOAD_ADDR) \
+               -o $(<:.o=) -e $(<:.o=) $^ \
                -L../../examples -lstubs \
                -L../../lib_generic -lgeneric \
                -L$(gcclibdir) -lgcc
        $(OBJCOPY) -O srec $(<:.o=) $@
 
 eeprom.bin:    eeprom.srec
-       $(OBJCOPY) -O binary $< $@ 2>/dev/null
+       $(OBJCOPY) -I srec -O binary $< $@ 2>/dev/null
 
 clean:
        rm -f $(SOBJS) $(OBJS) eeprom eeprom.srec eeprom.bin
index 6383a0203b5be729a51aa652f8c33f04d044ed84..25e22947d777c46717d00b3daa4c053e823b32af 100644 (file)
 
 #define SMC_BASE_ADDRESS CONFIG_SMC91111_BASE
 
-static int verify_macaddr(char *);
-static int set_mac(char *);
-
-int eeprom(int argc, char *argv[])
-{
-       app_startup(argv);
-       if (get_version() != XF_VERSION) {
-               printf("Wrong XF_VERSION.\n");
-               printf("Application expects ABI version %d\n", XF_VERSION);
-               printf("Actual U-Boot ABI version %d\n", (int)get_version());
-               return 1;
-       }
-
-       if ((SMC_inw (BANK_SELECT) & 0xFF00) != 0x3300) {
-               printf("SMSC91111 not found.\n");
-               return 2;
-       }
-
-       if (argc != 2) {
-               printf("VoiceBlue EEPROM writer\n");
-               printf("Built: %s at %s\n", __DATE__ , __TIME__ );
-               printf("Usage:\n\t<mac_address>");
-               return 3;
-       }
-
-       set_mac(argv[1]);
-       if (verify_macaddr(argv[1])) {
-               printf("*** ERROR ***\n");
-               return 4;
-       }
-
-       return 0;
-}
-
 static u16 read_eeprom_reg(u16 reg)
 {
        int timeout;
@@ -106,17 +72,28 @@ static int write_eeprom_reg(u16 value, u16 reg)
        return 1;
 }
 
+static int write_data(u16 *buf, int len)
+{
+       u16 reg = 0x23;
+
+       while (len--)
+               write_eeprom_reg(*buf++, reg++);
+
+       return 0;
+}
+
 static int verify_macaddr(char *s)
 {
        u16 reg;
        int i, err = 0;
 
-       printf("Verifying MAC Address: ");
+       printf("MAC Address: ");
        err = i = 0;
        for (i = 0; i < 3; i++) {
                reg = read_eeprom_reg(0x20 + i);
                printf("%02x:%02x%c", reg & 0xff, reg >> 8, i != 2 ? ':' : '\n');
-               err |= reg != ((u16 *)s)[i];
+               if (s)
+                       err |= reg != ((u16 *)s)[i];
        }
 
        return err ? 0 : 1;
@@ -138,3 +115,98 @@ static int set_mac(char *s)
 
        return 0;
 }
+
+static int parse_element(char *s, unsigned char *buf, int len)
+{
+       int cnt;
+       char *p, num[3];
+       unsigned char id;
+
+       id = simple_strtoul(s, &p, 16);
+       if (*p++ != ':')
+               return -1;
+       cnt = 2;
+       num[2] = 0;
+       for (; *p; p += 2) {
+               if (p[1] == 0)
+                       return -2;
+               if (cnt + 3 > len)
+                       return -3;
+               num[0] = p[0];
+               num[1] = p[1];
+               buf[cnt++] = simple_strtoul(num, NULL, 16);
+       }
+       buf[0] = id;
+       buf[1] = cnt - 2;
+
+       return cnt;
+}
+
+int eeprom(int argc, char *argv[])
+{
+       int i, len, ret;
+       unsigned char buf[58], *p;
+       
+       app_startup(argv);
+       if (get_version() != XF_VERSION) {
+               printf("Wrong XF_VERSION.\n");
+               printf("Application expects ABI version %d\n", XF_VERSION);
+               printf("Actual U-Boot ABI version %d\n", (int)get_version());
+               return 1;
+       }
+
+       if ((SMC_inw (BANK_SELECT) & 0xFF00) != 0x3300) {
+               printf("SMSC91111 not found.\n");
+               return 2;
+       }
+
+       /* Called without parameters - print MAC address */
+       if (argc < 2) {
+               verify_macaddr(NULL);
+               return 0;
+       }
+
+       /* Print help message */
+       if (argv[1][1] == 'h') {
+               printf("VoiceBlue EEPROM writer\n");
+               printf("Built: %s at %s\n", __DATE__ , __TIME__ );
+               printf("Usage:\n\t<mac_address> [<element_1>] [<...>]\n");
+               return 0;
+       }
+
+       /* Try to parse information elements */
+       len = sizeof(buf);
+       p = buf;
+       for (i = 2; i < argc; i++) {
+               ret = parse_element(argv[i], p, len);
+               switch (ret) {
+               case -1:
+                       printf("Element %d: malformed\n", i - 1);
+                       return 3;
+               case -2:
+                       printf("Element %d: odd character count\n", i - 1);
+                       return 3;
+               case -3:
+                       printf("Out of EEPROM memory\n");
+                       return 3;
+               default:
+                       p += ret;
+                       len -= ret;
+               }
+       }
+
+       /* First argument (MAC) is mandatory */
+       set_mac(argv[1]);
+       if (verify_macaddr(argv[1])) {
+               printf("*** MAC address does not match! ***\n");
+               return 4;
+       }
+
+       while (len--)
+               *p++ = 0;
+
+       write_data((u16 *)buf, sizeof(buf) >> 1);
+
+       return 0;
+}
+