boop/Asixtool/trunk/main.c
2017-07-01 21:56:25 +02:00

312 lines
6.9 KiB
C

/*
main.c - main program
Copyright (C) 2007 Ch. Klippel <ck@mamalala.net>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdio.h"
#include "asix_serial.h"
#include "infohelper.h"
#include "fcntl.h"
#include "unistd.h"
#include <string.h>
#include "bootcom.h"
#define VERSION_MAJOR 0
#define VERSION_MINOR 1
extern char verbosity;
extern int do_erase;
unsigned long radr, f0adr, f0len;
void printHeader(void)
{
printf("\nasixtool V%i.%i\n\n", VERSION_MAJOR, VERSION_MINOR);
printf("This Software is free Software under GNU GPL 3 or later\n");
printf("(c) 2007 Ch. Klippel <ck@mamalala.net>\n\n");
}
void printUsage(void)
{
printf("usage: asixtool [-d NAME] [-a [NAME] [-A ADRDESS]] [-e] [-S] [-c] [-N]\n\n");
printf(" -d NAME specify serial device, default is /dev/ttyS0\n");
printf(" -r NAME specify file to read flash into, default is flash_dump.bin\n");
printf(" -a NAME specify file to write to flash, default is flash.bin\n");
printf(" -A ADDRESS optionally specifies the start-address to load into/read from flash\n");
printf(" default is 0x000000 - must be specified in hex\n");
printf(" -L ADDRESS optionally specifies the maximum number of bytes to load into/read from flash\n");
printf(" default is 0x080000 - must be specified in hex\n");
printf(" -e completely erase the flash before writing\n");
printf(" default is no erase\n");
printf(" -s erase flash sectors as needed.\n");
printf(" this is a lot faster if only a few sectors are used\n");
printf(" -? print this help\n");
printf("\n");
printf("ATTENTION: commands are order-sensitive! for example, to set an address, you MUST\n");
printf("specify the address with -A before you specify any of the -r or -w commands. this\n");
printf("allows you to upload serveral binary files to serveral places with one command.\n");
}
unsigned long parseHex(char *buf)
{
unsigned char cnt;
unsigned long adr;
cnt = 0;
adr = 0;
while(buf[cnt])
{
adr <<= 4;
if(buf[cnt] >= '0' && buf[cnt] <= '9')
{
adr += (buf[cnt] - '0');
}
else if(buf[cnt] >= 'A' && buf[cnt] <= 'F')
{
adr += (buf[cnt] - 'A' + 10);
}
else if(buf[cnt] >= 'a' && buf[cnt] <= 'f')
{
adr += (buf[cnt] - 'a' + 10);
}
else if(buf[cnt] == 'x' || buf[cnt] == 'X')
{
adr = 0;
}
else
{
}
cnt++;
}
return adr;
}
int main(int argc,char **argv)
{
char sname[256];
char rname[256];
char f0name[256];
int isOpen;
int numw;
unsigned int baud;
unsigned char i, cmd;
baud = 115200;
do_erase = 0;
numw = 0;
isOpen = 0;
sprintf(sname,"/dev/ttyS0");
sprintf(rname,"flash_dump.bin");
sprintf(f0name,"flash.bin");
f0adr = 0x000000;
f0len = 0x080000;
printHeader();
verbosity = 1;
if(argc <= 1)
goto bailout;
rescan:
for(i=1;i<argc;i++)
{
if(argv[i][0] == '-')
{
cmd = 0;
if(argv[i][1] == '-')
{
cmd = argv[i][2];
}
else
{
cmd = argv[i][1];
}
if(isOpen == 0)
{
switch(cmd)
{
case 'h':
baud = 921600;
break;
case 'd':
if((argc > i+1) && (argv[i+1][0] != '-'))
{
strncpy(sname,argv[++i],256);
printInfoS(1,"opening serial device",sname);
if(isOpen)
{
if(closeSerial() == 0)
{
isOpen = 0;
}
else
{
printError("cant close port");
return 0;
}
}
if(openSerial(sname, baud))
{
isOpen = 1;
}
else
{
printError("cant open port");
return 0;
}
}
else
{
printError("Error in device argument");
goto bailout;
}
break;
}
}
else
{
switch(cmd)
{
case 'd':
if((argc > i+1) && (argv[i+1][0] != '-'))
{
strncpy(sname,argv[++i],256);
printInfoS(1,"closing serial device",sname);
if(closeSerial() == 0)
{
isOpen = 0;
}
else
{
printError("cant close port");
return 0;
}
printInfoS(1,"opening serial device",sname);
if(openSerial(sname, baud))
{
isOpen = 1;
}
else
{
printError("cant open port");
return 0;
}
}
else
{
printError("Error in device argument");
goto bailout;
}
break;
case 'r':
if((argc > i+1) && (argv[i+1][0] != '-'))
{
strncpy(rname,argv[++i],256);
}
printInfoS(1,"reading flash image",rname);
numw = readFlash(rname, f0adr, f0len);
if(numw)
{
printInfoS(1, "done reading memory ",0);
}
else
{
printErrorS("Error in reading memory-image",rname);
return 0;
}
break;
case 'a':
if((argc > i+1) && (argv[i+1][0] != '-'))
{
strncpy(f0name,argv[++i],256);
}
printInfoS(1,"writing flash image",f0name);
numw = writeFlash(f0name, f0adr, f0len);
if(numw)
{
printInfoS(1, "done writing memory ",0);
f0len = numw;
}
else
{
printErrorS("Error in writing memory-image",f0name);
return 0;
}
break;
case 'A':
if((argc > i+1) && (argv[i+1][0] != '-'))
{
f0adr = parseHex(argv[++i]);
printInfoH(1,"setting address for flash @",f0adr);
}
else
printInfoH(1,"used -A but no address given, using default",f0adr);
f0len = 0x080000;
break;
case 'L':
if((argc > i+1) && (argv[i+1][0] != '-'))
{
f0len = parseHex(argv[++i]);
printInfoH(1,"setting length for flash @",f0len);
}
else
printInfoH(1,"used -L but no address given, using default",f0len);
break;
case 'e':
printInfoS(1,"erasing flash before write",0);
if(!eraseFlash(f0adr))
{
printError("cant erase flash");
return 0;
}
break;
case 's':
printInfoS(1,"erasing sectors as needed",0);
do_erase = 1;
break;
}
}
}
else
{
bailout:
printUsage();
return 0;
}
}
if((isOpen == 0) && (argc > 1))
{
printInfoS(1,"using serial device",sname);
if(openSerial(sname, baud))
{
isOpen = 1;
goto rescan;
}
}
else if(isOpen != 0)
{
printInfoS(1,"closing serial device",sname);
closeSerial();
}
return 1;
}