X-Git-Url: https://hackdaworld.org/cgi-bin/gitweb.cgi?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Flpcload.c;h=38d53864c778ab7922392c2327c326955bc3cec6;hp=d1bfd5473c6ee477bd83821d1d7f42bd80713f42;hb=HEAD;hpb=afe6191925fbdac90169ed8a463bd9928276a863 diff --git a/betty/lpcload.c b/betty/lpcload.c index d1bfd54..38d5386 100644 --- a/betty/lpcload.c +++ b/betty/lpcload.c @@ -22,6 +22,7 @@ #define BANK2 (1<<3) #define BL (1<<4) #define FLASHFW (1<<5) +#define BINARY (1<<6) #define BANK0_ADDR 0x80000000 #define BANK2_ADDR 0x82000000 @@ -97,6 +98,7 @@ void usage(void) { printf(" -Dx \n"); printf(" x=0: bank0, x=2: bank2, x=b: bootloader\n"); printf(" -w \n"); + printf(" -b (if firmware for flash is a binary)\n"); printf(" -v\n"); } @@ -554,6 +556,9 @@ int send_cmd(int sfd,u32 addr,u32 len,u8 cmd) { cnt+=ret; } + /* flush */ + tcflush(sfd,TCIOFLUSH); + return 0; } @@ -561,7 +566,6 @@ int write_to_flash(t_lpc *lpc,u8 *buf,u32 addr,int len) { int cnt,ret; u8 cksml,cksmr; - u8 check; int i; /* prepare addr */ @@ -574,34 +578,18 @@ int write_to_flash(t_lpc *lpc,u8 *buf,u32 addr,int len) { cnt=0; cksml=0; while(len) { - for(i=0;i<2;i++) { - while(1) { - ret=write(lpc->sfd,buf+cnt+i,1); - if(ret<0) { - perror("transmit flash content (w)"); - return ret; - } - if(ret==1) - break; - } - while(1) { - ret=read(lpc->sfd,&check,1); - if(ret<0) { - perror("transmit flash content (r)"); - return ret; - } - if(ret==1) - break; - } - if(buf[cnt+i]!=check) - printf("FATAL: write to flash (transfer)\n"); + ret=write(lpc->sfd,buf+cnt,len); + if(ret<0) { + perror("transmit flash content (w)"); + return ret; } - cksml+=buf[cnt]; - cksml+=buf[cnt+1]; - cnt+=2; - len-=2; + for(i=cnt;isfd,&cksmr,1); @@ -638,6 +626,29 @@ int firmware_to_mem(t_lpc *lpc,u8 memtype) { else return -1; + /* another evil hack to support binary format */ + if((lpc->info&BINARY)&&(memtype==FLASH)) { + addr=0; + ret=1; + while(ret) { + ret=read(fd,buf,16); + if(ret!=16) { + printf("D'OH ...\n"); + return -1; + } + buf[16]='s'; // skip + for(temp=0;temp<16;temp++) + if((u8)buf[temp]!=0xff) + buf[16]='w'; // write + printf("addr:%08x\r",addr+lpc->roff); + fflush(stdout); + if(buf[16]=='w') + write_to_flash(lpc,(u8 *)buf,addr,16); + addr+=16; + } + return 0; + } + /* read a line */ ret=1; while(ret) { @@ -825,6 +836,9 @@ int main(int argc,char **argv) { strncpy(lpc.ffwfile,argv[++i],127); lpc.info|=FLASHFW; break; + case 'b': + lpc.info|=BINARY; + break; default: usage(); return -1; @@ -886,6 +900,10 @@ int main(int argc,char **argv) { if(lpc.info&FLASHFW) { printf("writing firmware to flash ...\n"); send_cmd(lpc.sfd,0,'0',CMD_CHIP_ERASE); + /* ack */ + ret=0; + while(!ret) + read(lpc.sfd,&ret,1); lpc.roff=BANK0_ADDR; firmware_to_mem(&lpc,FLASH); }