--- embedtools/src/athctl.c 2010/10/25 14:46:30 1.1.2.4 +++ embedtools/src/athctl.c 2010/10/27 11:58:57 1.1.2.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ - * $Id: athctl.c,v 1.1.2.4 2010/10/25 14:46:30 misho Exp $ + * $Id: athctl.c,v 1.1.2.5 2010/10/27 11:58:57 misho Exp $ * *************************************************************************/ #include "global.h" @@ -176,6 +176,7 @@ readWord(u_char *mem, u_long offset) register int timeout = ATH_ACCESS_TIMEOUT; u_long stat; + printf("Reading EEPROM memory %p+%lx ...\n", mem, offset); ATH_OUT(mem, AR5211_EEPROM_CONF, 0); usleep(ATH_ACCESS_WAIT); /* enable eeprom access */ @@ -213,6 +214,7 @@ writeWord(u_char *mem, u_long offset, u_short newval) u_long pcicfg, stat; u_short chk; + printf("Writing EEPROM memory %p+%lx ...\n", mem, offset); /* enable pci write access */ pcicfg = ATH_IN(mem, AR5K_PCICFG); ATH_OUT(mem, AR5K_PCICFG, (pcicfg & ~AR5K_PCICFG_SPWR_DN)); @@ -255,6 +257,8 @@ writeWord(u_char *mem, u_long offset, u_short newval) return -1; if (chk == newval) return 1; + else + VERB(1) printf("Write & Read don`t match 0x%04X != 0x%04X\n", newval, chk); if (i) printf("Warning:: Retrying EEPROM write ...\n"); } while (--i); @@ -263,18 +267,107 @@ writeWord(u_char *mem, u_long offset, u_short newval) return 0; } -/* static int -readEEPROM() +dumpFile(const char *csName, u_char *mem) { register u_long i; + u_short data, d1, d2; + u_short eeprom[ATH_EEPROM_SIZE] = { 0 }; + int f; - printf("Reading EEPROM ...\n"); + printf("Reading EEPROM memory %p ::\n", mem); for (i = 0; i < ATH_EEPROM_SIZE / 2; i++) { + if (!(i % 0x40)) { + printf("0x%04lX [", i * 2); + if (i) + printf("]\n"); + } + + if ((data = readWord(mem, i)) < 1) + return -1; + else { + d1 = data / 0x100; + d2 = data % 0x100; + } + + eeprom[i * 2] = d2; + eeprom[i * 2 + 1] = d1; + + printf("."); + usleep(ATH_ACCESS_WAITDOWN); } + printf("]\n"); + + printf("Saving EEPROM to file %s ... ", csName); + f = open(csName, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (f == -1) { + printf("Failed!\nError:: in create file %s #%d - %s\n", csName, + errno, strerror(errno)); + return 0; + } + if (write(f, eeprom, ATH_EEPROM_SIZE) == -1) { + printf("Failed!\nError:: in write to file %s #%d - %s\n", csName, + errno, strerror(errno)); + close(f); + return 0; + } + close(f); + printf("OK!\n"); + return 1; } -*/ +static int +flashFile(const char *csName, u_char *mem) +{ + register u_long i; + u_short data, d1; + u_short eeprom[ATH_EEPROM_SIZE] = { 0 }; + int f; + + printf("Reading EEPROM from file %s ... ", csName); + f = open(csName, O_RDONLY); + if (f == -1) { + printf("Failed!\nError:: in open file %s #%d - %s\n", csName, + errno, strerror(errno)); + return 0; + } + if (read(f, eeprom, ATH_EEPROM_SIZE) != ATH_EEPROM_SIZE) { + printf("Failed!\nError:: failed load image from file %s\n", csName); + close(f); + return 0; + } + close(f); + printf("OK!\n"); + + printf("Writing EEPROM memory %p ::\n", mem); + for (i = 0; i < ATH_EEPROM_SIZE / 2; i++) { + if (!(i % 0x40)) { + printf("0x%04lX [", i * 2); + if (i) + printf("]\n"); + } + + if ((data = readWord(mem, i)) < 1) + return -1; + else + d1 = eeprom[i * 2 + 1] * 0x100 + eeprom[i * 2]; + + if (data == d1) + printf("."); + else { + printf("x"); + + if (writeWord(mem, i, d1) < 1) + return -1; + } + + usleep(ATH_ACCESS_WAITDOWN); + } + printf("]\n"); + + return 0; +} + // ---------------------------------------------------- int @@ -381,6 +474,25 @@ main(int argc, char **argv) if (!(basemem = devOpen(baseaddr))) return 2; if ((ret = writeWord(basemem, offset, newval)) < 1) { + devClose(basemem); + return 3; + } + devClose(basemem); + } + + if (mode & 0x10) { + if (!(basemem = devOpen(baseaddr))) + return 2; + if ((ret = dumpFile(szName, basemem)) < 1) { + devClose(basemem); + return 3; + } + devClose(basemem); + } + if (mode & 0x20) { + if (!(basemem = devOpen(baseaddr))) + return 2; + if ((ret = flashFile(szName, basemem)) < 1) { devClose(basemem); return 3; }