projects
/
my-code
/
arm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
writing hex files to flash should work now ...
[my-code/arm.git]
/
betty
/
lpcload.c
diff --git
a/betty/lpcload.c
b/betty/lpcload.c
index
748a096
..
9f60d88
100644
(file)
--- 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);
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;
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 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;
/* send cmd */
send_cmd(lpc->sfd,addr+lpc->roff,len,CMD_WRITE);
/* transfer data */
cnt=0;
- cksm=0;
+ cksm
l
=0;
while(len) {
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];
+ cksm
l
+=buf[cnt];
+ cksm
l
+=buf[cnt+1];
cnt+=2;
len-=2;
}
/* check ack */
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;
}
return 0;