addr modifications (+ ram offset - hex file offset)
authorhackbard <hackbard@sage.physik.uni-augsburg.de>
Wed, 1 Aug 2007 13:20:04 +0000 (15:20 +0200)
committerhackbard <hackbard@sage.physik.uni-augsburg.de>
Wed, 1 Aug 2007 13:20:04 +0000 (15:20 +0200)
betty/lpcload.c

index c2b1114..a1dd97f 100644 (file)
@@ -40,6 +40,7 @@
 #define INVALID_STOP_BIT       "18\r\n"
 
 #define CRYSTFREQ              "10000"
+#define RAMOFFSET              0x40000200
 
 #define BUFSIZE                        128
 
@@ -56,6 +57,8 @@ typedef struct s_lpc {
        char freq[8];           /* frequency */
        int partid;             /* part id */
        u8 bcv[2];              /* boot code version */
+       u32 hoff;               /* start addr of ihex file */
+       u32 roff;               /* ram offset of uc */
 } t_lpc;
 
 void usage(void) {
@@ -64,6 +67,7 @@ void usage(void) {
        printf("  -d <serial device>\n");
        printf("  -f <firmware>\n");
        printf("  -c <crystal freq>\n");
+       printf("  -r <ram offset>\n");
        printf("  -v\n");
 
 }
@@ -118,6 +122,9 @@ int open_serial_device(t_lpc *lpc) {
 
 int open_firmware(t_lpc *lpc) {
 
+       int ret;
+       char buf[BUFSIZE];
+
        /* open firmware file */
 
        lpc->fwfd=open(lpc->fwfile,O_RDONLY);
@@ -125,6 +132,16 @@ int open_firmware(t_lpc *lpc) {
        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;
 }
 
@@ -311,7 +328,12 @@ int write_to_ram(t_lpc *lpc,u8 *buf,u32 addr,int len) {
        }
        for(i=len;i<nlen;i++) buf[i]=0;
 
+       /* prepare addr */
+       addr+=(lpc->roff-lpc->hoff);
+
        /* prepare write command */
+       if(lpc->info&VERBOSE)
+               printf("writing %02x bytes to %08x\n",len,addr);
        snprintf(txrxbuf,BUFSIZE,"W %d %d\r\n",addr,len);
        slen=strlen(txrxbuf);
 
@@ -456,6 +478,7 @@ int main(int argc,char **argv) {
 
        memset(&lpc,0,sizeof(t_lpc));
        strncpy(lpc.freq,CRYSTFREQ,7);
+       lpc.roff=RAMOFFSET;
 
        /* parse argv */
 
@@ -491,9 +514,14 @@ int main(int argc,char **argv) {
        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");
-       bl_init(&lpc);
+       if(bl_init(&lpc)<0)
+               return -1;
 
        /* read part id */
        read_part_id(&lpc);
@@ -504,8 +532,6 @@ int main(int argc,char **argv) {
        printf("boot code version: %02x %02x\n",lpc.bcv[0],lpc.bcv[1]);
 
        // to be continued ... (parsing fw file and poking it to ram)
-       if(open_firmware(&lpc)<0)
-               goto end;
        firmware_to_ram(&lpc);
 
 end: