X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=betty%2Flpcload.c;h=c2b111425f4befe3372996584b3a32b6eb1d0d86;hb=f5a2aa532e12c8f242bd7b767702ac65f1a7d48d;hp=8bd853010f225979c073ad24a3d5aaa630b693f6;hpb=e98e1b46f919aaa0eadb3a74ada0e4f6220a589c;p=my-code%2Farm.git diff --git a/betty/lpcload.c b/betty/lpcload.c index 8bd8530..c2b1114 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" @@ -40,9 +41,11 @@ #define CRYSTFREQ "10000" -#define BUFSIZE 64 +#define BUFSIZE 128 typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; typedef struct s_lpc { int sfd; /* serial fd */ @@ -165,6 +168,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 +198,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; @@ -262,7 +269,7 @@ int read_bcv(t_lpc *lpc) { 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,7 +278,7 @@ int read_bcv(t_lpc *lpc) { return 0; } -int uuencode(char *in,char *out) { +int uuencode(u8 *in,char *out) { out[0]=0x20+((in[0]>>2)&0x3f); out[1]=0x20+(((in[0]<<4)|(in[1]>>4))&0x3f); @@ -281,27 +288,82 @@ int uuencode(char *in,char *out) { return 0; } -int write_to_ram(t_lpc *lpc,char *buf,int addr,int len) { +int write_to_ram(t_lpc *lpc,u8 *buf,u32 addr,int len) { int lcount; - u8 checksum; + u32 checksum; + char 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; } - while(1) { - if(!(lcount%20)) { + /* 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,buf,1); + switch(buf[0]) { + case '\r': + continue; + case '\n': + continue; + case ':': + /* start code */ + break; + default: + printf("fw to ram: no ihex format\n"); + return -1; + } + /* 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); + /* read type */ + ret=read(lpc->fwfd,buf,2); + sscanf(buf,"%02x",&type); + /* successfull return if type is end of file */ + if(type==0x01) + return 0; + /* read data */ + ret=read(lpc->fwfd,buf,2*len); + if(ret!=(2*len)) { + printf("fw to ram: data missing\n"); + return -1; + } + /* checksum */ + cksum=0; + for(i=0;ifwfd,buf,2); + sscanf(buf,"%02x",&val); + if(val+cksum!=0x100) { + printf("fw to ram: wrong checksum\n"); + return -1; + } + /* act according to type */ + switch(type) { + case 0x03: + /* get cs and ip */ + break; + case 0x00: + write_to_ram(lpc,data,addr,len); + break; + default: + printf("fw to ram: unknown type %02x\n",type); + return -1; + } + } return 0; }