projects
/
my-code
/
arm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added initial linker script and tartup asm code
[my-code/arm.git]
/
betty
/
lpcload.c
diff --git
a/betty/lpcload.c
b/betty/lpcload.c
index
6ec1186
..
30a808e
100644
(file)
--- a/
betty/lpcload.c
+++ b/
betty/lpcload.c
@@
-19,11
+19,12
@@
#define VERBOSE (1<<0)
#define FIRMWARE (1<<1)
#define VERBOSE (1<<0)
#define FIRMWARE (1<<1)
+#define TXRX_TYPE_SYNC 0x00
+#define TXRX_TYPE_CKSM 0x00
#define TXRX_TYPE_BAUD 0x01
#define TXRX_TYPE_BAUD 0x01
-#define TXRX_TYPE_SYNC 0x02
-#define TXRX_TYPE_CMD 0x03
-#define TXRX_TYPE_DATA 0x04
-#define TXRX_TYPE_CKSM 0x05
+#define TXRX_TYPE_CMD 0x02
+#define TXRX_TYPE_DATA 0x03
+#define TXRX_TYPE_GO 0x04
#define CMD_SUCCESS "0\r\n"
#define INVALID_COMMAND "1\r\n"
#define CMD_SUCCESS "0\r\n"
#define INVALID_COMMAND "1\r\n"
@@
-58,8
+59,8
@@
typedef struct s_lpc {
char fwfile[128]; /* firmware file */
u8 info; /* info/mode */
char freq[8]; /* frequency */
char fwfile[128]; /* firmware file */
u8 info; /* info/mode */
char freq[8]; /* frequency */
- u32 hoff; /* start addr of ihex file */
u32 roff; /* ram offset of uc */
u32 roff; /* ram offset of uc */
+ u32 jaddr; /* addr for the jump */
} t_lpc;
void usage(void) {
} t_lpc;
void usage(void) {
@@
-93,8
+94,8
@@
int open_serial_device(t_lpc *lpc) {
// input/output baudrate
// input/output baudrate
- cfsetispeed(&term,B
96
00);
- cfsetospeed(&term,B
96
00);
+ cfsetispeed(&term,B
384
00);
+ cfsetospeed(&term,B
384
00);
// control options -> 8n1
// control options -> 8n1
@@
-112,6
+113,10
@@
int open_serial_device(t_lpc *lpc) {
//term.c_iflag&=~(IXON|IXOFF|IXANY|INLCR|ICRNL);
term.c_iflag&=~(INLCR|ICRNL|IXANY);
term.c_iflag|=(IXON|IXOFF);
//term.c_iflag&=~(IXON|IXOFF|IXANY|INLCR|ICRNL);
term.c_iflag&=~(INLCR|ICRNL|IXANY);
term.c_iflag|=(IXON|IXOFF);
+
+ // output options
+
+ term.c_oflag=0;
// more control options -> timeout / flow control
// more control options -> timeout / flow control
@@
-127,9
+132,6
@@
int open_serial_device(t_lpc *lpc) {
int open_firmware(t_lpc *lpc) {
int open_firmware(t_lpc *lpc) {
- int ret;
- char buf[BUFSIZE];
-
/* open firmware file */
lpc->fwfd=open(lpc->fwfile,O_RDONLY);
/* open firmware file */
lpc->fwfd=open(lpc->fwfile,O_RDONLY);
@@
-137,16
+139,6
@@
int open_firmware(t_lpc *lpc) {
if(lpc->fwfd<0)
perror("fw open");
if(lpc->fwfd<0)
perror("fw open");
- /* read hex file offset */
-
- ret=read(lpc->fwfd,buf,7);
- if(buf[0]!=':') {
- printf("fw open: not an intel hex file?\n");
- return -1;
- }
- sscanf(buf+3,"%04x",&(lpc->hoff));
- lseek(lpc->fwfd,0,SEEK_SET);
-
return lpc->fwfd;
}
return lpc->fwfd;
}
@@
-247,6
+239,11
@@
int txrx(t_lpc *lpc,char *buf,int len,u8 type) {
}
buf[cnt+1]='\0';
}
buf[cnt+1]='\0';
+ /* return if type is go */
+
+ if(type==TXRX_TYPE_GO)
+ return 0;
+
/* check/strip return code if type is cmd */
if(type==TXRX_TYPE_CMD) {
/* check/strip return code if type is cmd */
if(type==TXRX_TYPE_CMD) {
@@
-315,9
+312,9
@@
int go(t_lpc *lpc) {
char buf[BUFSIZE];
int ret,len;
char buf[BUFSIZE];
int ret,len;
- snprintf(buf,BUFSIZE,"G %d A\r\n",lpc->
roff
);
+ snprintf(buf,BUFSIZE,"G %d A\r\n",lpc->
jaddr
);
len=strlen(buf);
len=strlen(buf);
- ret=txrx(lpc,buf,
ret,TXRX_TYPE_CMD
);
+ ret=txrx(lpc,buf,
len,TXRX_TYPE_GO
);
return ret;
}
return ret;
}
@@
-349,7
+346,7
@@
int write_to_ram(t_lpc *lpc,char *buf,u32 addr,int len) {
}
/* make it a multiple of 3 (reason: uuencode) */
}
/* make it a multiple of 3 (reason: uuencode) */
- nlen=(
len/3+1)*3
;
+ nlen=(
!(len%3))?len:((len/3+1)*3)
;
if(nlen>BUFSIZE) {
printf("ram write: too much data\n");
return -1;
if(nlen>BUFSIZE) {
printf("ram write: too much data\n");
return -1;
@@
-357,7
+354,7
@@
int write_to_ram(t_lpc *lpc,char *buf,u32 addr,int len) {
for(i=len;i<nlen;i++) buf[i]=0;
/* prepare addr */
for(i=len;i<nlen;i++) buf[i]=0;
/* prepare addr */
- addr+=
(lpc->roff-lpc->hoff)
;
+ addr+=
lpc->roff
;
/* prepare write command */
if(lpc->info&VERBOSE)
/* prepare write command */
if(lpc->info&VERBOSE)
@@
-376,7
+373,8
@@
int write_to_ram(t_lpc *lpc,char *buf,u32 addr,int len) {
while(bcnt<nlen) {
/* uuencode / prepare data bytes */
while(bcnt<nlen) {
/* uuencode / prepare data bytes */
- uuencode((u8 *)(buf+bcnt),(u8 *)(txrxbuf),bcnt==nlen-3?len%3:3);
+ uuencode((u8 *)(buf+bcnt),(u8 *)(txrxbuf),
+ (bcnt==nlen-3)?(len%3?len%3:3):3);
txrxbuf[5]='\r';
txrxbuf[6]='\n';
txrxbuf[5]='\r';
txrxbuf[6]='\n';
@@
-384,7
+382,7
@@
int write_to_ram(t_lpc *lpc,char *buf,u32 addr,int len) {
checksum+=((u8)buf[bcnt]+(u8)buf[bcnt+1]+(u8)buf[bcnt+2]);
/* send a data line */
checksum+=((u8)buf[bcnt]+(u8)buf[bcnt+1]+(u8)buf[bcnt+2]);
/* send a data line */
- txrx(lpc,txrxbuf,
6
,TXRX_TYPE_DATA);
+ txrx(lpc,txrxbuf,
7
,TXRX_TYPE_DATA);
/* increase counters */
lcount+=1;
/* increase counters */
lcount+=1;
@@
-445,10
+443,6
@@
int firmware_to_ram(t_lpc *lpc) {
/* read len */
ret=read(lpc->fwfd,buf,2);
sscanf(buf,"%02x",&len);
/* read len */
ret=read(lpc->fwfd,buf,2);
sscanf(buf,"%02x",&len);
- if(len%4) {
- printf("fw to ram: len not a multiple of 4\n");
- return -1;
- }
/* read addr */
ret=read(lpc->fwfd,buf,4);
sscanf(buf,"%04x",&addr);
/* read addr */
ret=read(lpc->fwfd,buf,4);
sscanf(buf,"%04x",&addr);
@@
-470,12
+464,23
@@
int firmware_to_ram(t_lpc *lpc) {
}
/* act according to type */
switch(type) {
}
/* act according to type */
switch(type) {
- case 0x03:
-
/* get cs and ip */
-
break;
+
//
case 0x03:
+
//
/* get cs and ip */
+
//
break;
case 0x00:
case 0x00:
+ if(len%4) {
+ printf("fw to ram: invalid len\n");
+ return -1;
+ }
write_to_ram(lpc,buf,addr,len);
break;
write_to_ram(lpc,buf,addr,len);
break;
+ case 0x04:
+ lpc->roff=((buf[0]<<24)|(buf[1]<<16));
+ break;
+ case 0x05:
+ lpc->jaddr=((buf[0]<<24)|(buf[1]<<16));
+ lpc->jaddr|=((buf[2]<<8)|buf[3]);
+ break;
default:
printf("fw to ram: unknown type %02x\n",type);
return -1;
default:
printf("fw to ram: unknown type %02x\n",type);
return -1;
@@
-489,6
+494,7
@@
int main(int argc,char **argv) {
t_lpc lpc;
int i;
t_lpc lpc;
int i;
+ int ret;
/*
* initial ...
/*
* initial ...
@@
-497,6
+503,7
@@
int main(int argc,char **argv) {
memset(&lpc,0,sizeof(t_lpc));
strncpy(lpc.freq,CRYSTFREQ,7);
lpc.roff=RAMOFFSET;
memset(&lpc,0,sizeof(t_lpc));
strncpy(lpc.freq,CRYSTFREQ,7);
lpc.roff=RAMOFFSET;
+ lpc.jaddr=RAMOFFSET;
/* parse argv */
/* parse argv */
@@
-532,24
+539,32
@@
int main(int argc,char **argv) {
if(open_serial_device(&lpc)<0)
goto end;
if(open_serial_device(&lpc)<0)
goto end;
- /* open firmware file */
- if(open_firmware(&lpc)<0)
- goto end;
-
/* boot loader init */
printf("boot loader init ...\n");
if(bl_init(&lpc)<0)
return -1;
/* boot loader init */
printf("boot loader init ...\n");
if(bl_init(&lpc)<0)
return -1;
+ /* quit if there is no hex file to process */
+ if(!(lpc.info&FIRMWARE)) {
+ printf("no firmware -> aborting\n");
+ goto end;
+ }
+
+ /* open firmware file */
+ if(open_firmware(&lpc)<0)
+ goto end;
+
/* parse intel hex file and write to ram */
printf("write firmware to ram ...\n");
firmware_to_ram(&lpc);
/* unlock go cmd */
/* parse intel hex file and write to ram */
printf("write firmware to ram ...\n");
firmware_to_ram(&lpc);
/* unlock go cmd */
+ printf("unlock go command ...\n");
unlock_go(&lpc);
/* go! */
unlock_go(&lpc);
/* go! */
- go(&lpc);
+ printf("go ...\n");
+ ret=go(&lpc);
end:
close(lpc.sfd);
end:
close(lpc.sfd);