X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Flpcload.c;h=9f60d88c8ab921602c72a0ed6d0d3a606d3f8fc9;hp=748a0963c06a1a2781412822b4dbc5e7ec14fab4;hb=e013de8b92ff7ba9cf70c7c8669c023a315f1348;hpb=d9929818aa52c56daa1d89d1753e171b45c8608a diff --git a/betty/lpcload.c b/betty/lpcload.c index 748a096..9f60d88 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,61 @@ 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; /* send cmd */ send_cmd(lpc->sfd,addr+lpc->roff,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: wrong 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!"); + else + printf(" -> most probably due to failure in transfer!"); } return 0;