X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=betty%2Flpcload.c;h=30a808ec6ef8cb2baa6afda566e8a646303c3b9d;hb=cc9a44bee2152e887691958d3580e17ef15810e2;hp=0d2f9c85ddd9bfd9f5394c556a38ee666d707aa8;hpb=feece393fb07514608a7ad21eaa376ea3375e945;p=my-code%2Farm.git diff --git a/betty/lpcload.c b/betty/lpcload.c index 0d2f9c8..30a808e 100644 --- a/betty/lpcload.c +++ b/betty/lpcload.c @@ -19,11 +19,12 @@ #define VERBOSE (1<<0) #define FIRMWARE (1<<1) +#define TXRX_TYPE_SYNC 0x00 +#define TXRX_TYPE_CKSM 0x00 #define TXRX_TYPE_BAUD 0x01 -#define TXRX_TYPE_SYNC 0x02 -#define TXRX_TYPE_CMD 0x03 -#define TXRX_TYPE_DATA 0x04 -#define TXRX_TYPE_CKSM 0x05 +#define TXRX_TYPE_CMD 0x02 +#define TXRX_TYPE_DATA 0x03 +#define TXRX_TYPE_GO 0x04 #define CMD_SUCCESS "0\r\n" #define INVALID_COMMAND "1\r\n" @@ -58,8 +59,8 @@ typedef struct s_lpc { char fwfile[128]; /* firmware file */ u8 info; /* info/mode */ char freq[8]; /* frequency */ - u32 hoff; /* start addr of ihex file */ u32 roff; /* ram offset of uc */ + u32 jaddr; /* addr for the jump */ } t_lpc; void usage(void) { @@ -93,8 +94,8 @@ int open_serial_device(t_lpc *lpc) { // input/output baudrate - cfsetispeed(&term,B9600); - cfsetospeed(&term,B9600); + cfsetispeed(&term,B38400); + cfsetospeed(&term,B38400); // control options -> 8n1 @@ -112,6 +113,10 @@ int open_serial_device(t_lpc *lpc) { //term.c_iflag&=~(IXON|IXOFF|IXANY|INLCR|ICRNL); term.c_iflag&=~(INLCR|ICRNL|IXANY); term.c_iflag|=(IXON|IXOFF); + + // output options + + term.c_oflag=0; // more control options -> timeout / flow control @@ -127,9 +132,6 @@ int open_serial_device(t_lpc *lpc) { int open_firmware(t_lpc *lpc) { - int ret; - char buf[BUFSIZE]; - /* open firmware file */ lpc->fwfd=open(lpc->fwfile,O_RDONLY); @@ -137,16 +139,6 @@ int open_firmware(t_lpc *lpc) { if(lpc->fwfd<0) perror("fw open"); - /* read hex file offset */ - - ret=read(lpc->fwfd,buf,7); - if(buf[0]!=':') { - printf("fw open: not an intel hex file?\n"); - return -1; - } - sscanf(buf+3,"%04x",&(lpc->hoff)); - lseek(lpc->fwfd,0,SEEK_SET); - return lpc->fwfd; } @@ -247,6 +239,11 @@ int txrx(t_lpc *lpc,char *buf,int len,u8 type) { } buf[cnt+1]='\0'; + /* return if type is go */ + + if(type==TXRX_TYPE_GO) + return 0; + /* check/strip return code if type is cmd */ if(type==TXRX_TYPE_CMD) { @@ -315,9 +312,9 @@ int go(t_lpc *lpc) { char buf[BUFSIZE]; int ret,len; - snprintf(buf,BUFSIZE,"G %d A\r\n",lpc->roff); + snprintf(buf,BUFSIZE,"G %d A\r\n",lpc->jaddr); len=strlen(buf); - ret=txrx(lpc,buf,len,TXRX_TYPE_CMD); + ret=txrx(lpc,buf,len,TXRX_TYPE_GO); return ret; } @@ -357,7 +354,7 @@ int write_to_ram(t_lpc *lpc,char *buf,u32 addr,int len) { for(i=len;iroff-lpc->hoff); + addr+=lpc->roff; /* prepare write command */ if(lpc->info&VERBOSE) @@ -446,10 +443,6 @@ int firmware_to_ram(t_lpc *lpc) { /* read len */ ret=read(lpc->fwfd,buf,2); sscanf(buf,"%02x",&len); - if(len%4) { - printf("fw to ram: len not a multiple of 4\n"); - return -1; - } /* read addr */ ret=read(lpc->fwfd,buf,4); sscanf(buf,"%04x",&addr); @@ -471,12 +464,23 @@ int firmware_to_ram(t_lpc *lpc) { } /* act according to type */ switch(type) { - case 0x03: - /* get cs and ip */ - break; + //case 0x03: + // /* get cs and ip */ + // break; case 0x00: + if(len%4) { + printf("fw to ram: invalid len\n"); + return -1; + } write_to_ram(lpc,buf,addr,len); break; + case 0x04: + lpc->roff=((buf[0]<<24)|(buf[1]<<16)); + break; + case 0x05: + lpc->jaddr=((buf[0]<<24)|(buf[1]<<16)); + lpc->jaddr|=((buf[2]<<8)|buf[3]); + break; default: printf("fw to ram: unknown type %02x\n",type); return -1; @@ -490,6 +494,7 @@ int main(int argc,char **argv) { t_lpc lpc; int i; + int ret; /* * initial ... @@ -498,6 +503,7 @@ int main(int argc,char **argv) { memset(&lpc,0,sizeof(t_lpc)); strncpy(lpc.freq,CRYSTFREQ,7); lpc.roff=RAMOFFSET; + lpc.jaddr=RAMOFFSET; /* parse argv */ @@ -533,15 +539,21 @@ int main(int argc,char **argv) { if(open_serial_device(&lpc)<0) goto end; - /* open firmware file */ - if(open_firmware(&lpc)<0) - goto end; - /* boot loader init */ printf("boot loader init ...\n"); if(bl_init(&lpc)<0) return -1; + /* quit if there is no hex file to process */ + if(!(lpc.info&FIRMWARE)) { + printf("no firmware -> aborting\n"); + goto end; + } + + /* open firmware file */ + if(open_firmware(&lpc)<0) + goto end; + /* parse intel hex file and write to ram */ printf("write firmware to ram ...\n"); firmware_to_ram(&lpc); @@ -552,8 +564,7 @@ int main(int argc,char **argv) { /* go! */ printf("go ...\n"); - go(&lpc); - printf("\n"); + ret=go(&lpc); end: close(lpc.sfd);