X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Flpcload.c;h=0bf3006aa7dd262c3ce0872bd309cd7e4c1626ed;hp=ff78d967950474371f8fec874cc217770a690891;hb=f549db2020c9e68e37e89f3cb7a921e5a7f75954;hpb=06e719791011a2c8eb472943492b7b0b6d445c6f diff --git a/betty/lpcload.c b/betty/lpcload.c index ff78d96..0bf3006 100644 --- a/betty/lpcload.c +++ b/betty/lpcload.c @@ -19,7 +19,8 @@ #define TXRX_TYPE_BAUD 0x01 #define TXRX_TYPE_SYNC 0x02 -#define TXRX_TYPE_DATA 0x03 +#define TXRX_TYPE_CMD 0x03 +#define TXRX_TYPE_DATA 0x04 #define CMD_SUCCESS "0\r\n" #define INVALID_COMMAND "1\r\n" @@ -125,7 +126,7 @@ int open_firmware(t_lpc *lpc) { return lpc->fwfd; } -int txrx(t_lpc *lpc,char *buf,int len,u8 type) { +int txrx(t_lpc *lpc,u8 *buf,int len,u8 type) { int ret,cnt; int i; @@ -165,6 +166,11 @@ int txrx(t_lpc *lpc,char *buf,int len,u8 type) { } } + /* return here if type is data */ + + if(type==TXRX_TYPE_DATA) + return cnt; + /* read */ if(lpc->info&VERBOSE) @@ -190,12 +196,11 @@ int txrx(t_lpc *lpc,char *buf,int len,u8 type) { } if(lpc->info&VERBOSE) printf(" (%d)\n",cnt); - len=cnt; buf[cnt]='\0'; /* check/strip return code if type is data */ - if(type==TXRX_TYPE_DATA) { + if(type==TXRX_TYPE_CMD) { ret=strlen(CMD_SUCCESS); if(!strncmp(buf,CMD_SUCCESS,ret)) { for(i=ret;ipartid=atoi(buf); return lpc->partid; @@ -258,11 +263,11 @@ int read_part_id(t_lpc *lpc) { int read_bcv(t_lpc *lpc) { - char buf[BUFSIZE]; + u8 buf[BUFSIZE]; char *ptr; memcpy(buf,"K\r\n",3); - txrx(lpc,buf,3,TXRX_TYPE_DATA); + txrx(lpc,buf,3,TXRX_TYPE_CMD); ptr=strtok(buf,"\r\n"); lpc->bcv[0]=strtol(ptr,NULL,16); ptr=strtok(NULL,"\r\n"); @@ -271,6 +276,126 @@ int read_bcv(t_lpc *lpc) { return 0; } +int uuencode(u8 *in,u8 *out) { + + out[0]=0x20+((in[0]>>2)&0x3f); + out[1]=0x20+(((in[0]<<4)|(in[1]>>4))&0x3f); + out[2]=0x20+(((in[1]<<2)|(in[2]>>6))&0x3f); + out[3]=0x20+(in[2]&0x3f); + + return 0; +} + +int write_to_ram(t_lpc *lpc,u8 *buf,int addr,int len) { + + int lcount; + u8 checksum; + u8 txrxbuf[BUFSIZE]; + int count,bcnt; + int nlen,slen; + int i; + + /* check length */ + if(len%4) { + printf("ram write: not a multiple of 4\n"); + return -1; + } + + /* make it a multiple of 3 (reason: uuencode) */ + nlen=(len/3+1)*3; + if(nlen>BUFSIZE) { + printf("ram write: too much data\n"); + return -1; + } + for(i=len;ifwfd,line,1); + if(line[0]!=':') { + printf("fw to ram: no ihex format\n"); + return -1; + } + ret=read(lpc->fwfd,line+1,2); + line[3]='\0'; + len=atoi(line+1); + ret=read(lpc->fwfd,line+3,4); + line[7]='\0'; + addr=strtol(line+3); + + } + } + + return 0; +} + int main(int argc,char **argv) { t_lpc lpc; @@ -314,7 +439,8 @@ int main(int argc,char **argv) { } /* open serial port */ - open_serial_device(&lpc); + if(open_serial_device(&lpc)<0) + goto end; /* boot loader init */ printf("boot loader init ...\n"); @@ -329,9 +455,13 @@ int main(int argc,char **argv) { printf("boot code version: %02x %02x\n",lpc.bcv[0],lpc.bcv[1]); // to be continued ... (parsing fw file and poking it to ram) + if(open_firmware(&lpc)<0) + goto end; + firmware_to_ram(&lpc); -//end: +end: close(lpc.sfd); + close(lpc.fwfd); return 0; }