X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=betty%2Flpcload.c;h=9f60d88c8ab921602c72a0ed6d0d3a606d3f8fc9;hb=e013de8b92ff7ba9cf70c7c8669c023a315f1348;hp=4f62a59253febac2fd3f716dce996f3b69eb2f16;hpb=0f5679e8fd5b03c53a332a94f85008b0494fbd2e;p=my-code%2Farm.git diff --git a/betty/lpcload.c b/betty/lpcload.c index 4f62a59..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; @@ -539,42 +544,76 @@ int send_cmd(int sfd,u32 addr,u32 len,u8 cmd) { send[1+i+as]=(len>>((ls-1-i)*8))&0xff; cnt=0; - printf(" sending cmd: "); while(size) { ret=write(sfd,send+cnt,size); if(ret<0) { perror("dump file: send cmd "); return ret; } - for(i=cnt;isfd,addr,len,CMD_WRITE); + send_cmd(lpc->sfd,addr+lpc->roff,len,CMD_WRITE); /* transfer data */ + cnt=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"); } + cksml+=buf[cnt]; + cksml+=buf[cnt+1]; cnt+=2; + len-=2; + } + + /* check ack */ + while(1) { + ret=read(lpc->sfd,&cksmr,1); + if(ret<0) { + perror("write to flash: read cksm"); + return ret; + } + if(ret==1) break; + } + 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; @@ -647,7 +686,7 @@ int firmware_to_mem(t_lpc *lpc,u8 memtype) { if(memtype==RAM) write_to_ram(lpc,buf,addr,len); else - write_to_flash(lpc,buf,addr,len); + write_to_flash(lpc,(u8 *)buf,addr,len); break; case 0x04: lpc->roff=((buf[0]<<24)|(buf[1]<<16)); @@ -841,7 +880,8 @@ int main(int argc,char **argv) { /* write a firmware to the lpc flash */ if(lpc.info&FLASHFW) { - send_cmd(lpc.sfd,0,0,CMD_CHIP_ERASE); + printf("writing firmware to flash ...\n"); + send_cmd(lpc.sfd,0,'0',CMD_CHIP_ERASE); lpc.roff=BANK0_ADDR; firmware_to_mem(&lpc,FLASH); }