X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=betty%2Flpcload.c;h=d1bfd5473c6ee477bd83821d1d7f42bd80713f42;hb=afe6191925fbdac90169ed8a463bd9928276a863;hp=748a0963c06a1a2781412822b4dbc5e7ec14fab4;hpb=eca427bb7d2ac0dbd337a3797fcea63991c51b38;p=my-code%2Farm.git diff --git a/betty/lpcload.c b/betty/lpcload.c index 748a096..d1bfd54 100644 --- a/betty/lpcload.c +++ b/betty/lpcload.c @@ -174,6 +174,11 @@ int reconfig_serial_device(t_lpc *lpc) { cfsetispeed(&term,B115200); cfsetospeed(&term,B115200); + // timeouts + + term.c_cc[VMIN]=0; + term.c_cc[VTIME]=100; // 10 seconds timeout + ret=tcsetattr(lpc->sfd,TCSANOW,&term); return ret; @@ -554,40 +559,65 @@ int send_cmd(int sfd,u32 addr,u32 len,u8 cmd) { int write_to_flash(t_lpc *lpc,u8 *buf,u32 addr,int len) { - int cnt,size,ret; - u8 cksm; + int cnt,ret; + u8 cksml,cksmr; + u8 check; + int i; + + /* prepare addr */ + addr+=lpc->roff; /* send cmd */ - send_cmd(lpc->sfd,addr+lpc->roff,len,CMD_WRITE); + send_cmd(lpc->sfd,addr,len,CMD_WRITE); /* transfer data */ cnt=0; - cksm=0; + cksml=0; while(len) { - size=2; - while(size) { - ret=write(lpc->sfd,buf+cnt,2); - if(ret<0) { - perror("transmit flash content"); - return ret; + 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; } - size-=ret; + 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"); } - cksm+=buf[cnt]; - cksm+=buf[cnt+1]; + cksml+=buf[cnt]; + cksml+=buf[cnt+1]; cnt+=2; len-=2; } /* check ack */ - ret=read(lpc->sfd,buf,1); - if(ret<0) { - perror("write to flash: ack rx"); - return ret; + while(1) { + ret=read(lpc->sfd,&cksmr,1); + if(ret<0) { + perror("write to flash: read cksm"); + return ret; + } + if(ret==1) break; } - if(buf[0]!=cksm) { - printf("FATAL: write to ram: wrong checksum!\n"); - return -1; + if(cksml!=cksmr) { + printf("FATAL: wrong checksum or failure in flash write!\n"); + if(cksml+1==cksmr) + printf(" -> most probably due to flash write!\n"); + else + printf(" -> most probably failure in transfer!\n"); + printf(" addr:0x%08x l:%02x r:%02x\n",addr,cksml,cksmr); } return 0;