⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sload.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 2 页
字号:
  }/* * use GCSR to start execution in MVME162 * adjust pointer to compensate for page alignement  */  gcsr_map = (struct gcsr *)((u_long)gcsr_map + (u_long)gcsr_vme % pagesize);  if (reset) {                /* reset the local bus... */    gcsr_map->board_scr |= 0x80;  }  if (entry) {                /* ...load start address... */    gcsr_map->gpr[0] = entry >> 16U;    gcsr_map->gpr[1] = entry & 0x0000FFFF;  }  if (go) {                   /* ... and kick it in the ass! */    gcsr_map->lmsig = 0x1;  }}/*=================================================================== */main(int argc, char *argv[]){  char        inpstr[256];  u_char      image[256];  char        hdrstr[64];  int         i, j, k, result, size, line=0, lastrec=0;  long        addr, tsize=0, naddr=0, blksize=0, blknum=1;  FILE        *in;  char        infile[256] = "";   char        vmedev[32] = "/dev/vme32d32";   /* Assume "/dev/vme32d32"  */  int         vme, verbose = 0, go = 0, reset = 0, havefile = 0;  /*  Parse the command line */  --argc;  while (argv++, argc--) {    if (**argv != '-') {      strcpy(infile, *argv);      havefile = 1;    } else if (!strcmp(*argv, "-v")) {      verbose = 1;    } else if (!strcmp(*argv, "-g")) {      go = 1;    } else if (!strcmp(*argv, "-r")) {      reset = 1;/*    } else if (!strcmp(*argv, "-vme32")) { *//*      strcpy(vmedev, "/dev/vme32d32"); *//*    } else if (!strcmp(*argv, "-vme24")) { *//*      strcpy(vmedev, "/dev/vme24d32"); *//*    } else if (!strcmp(*argv, "-vme16")) { *//*      strcpy(vmedev, "/dev/vme16d32"); */    } else if (!strcmp(*argv, "-")) {        usage();        exit(0);    } else {        usage();        exit(0);    }  }  if (!havefile) {    if (!reset && !go) {        usage();    }    else {      MVMEControl(0, reset, go);    }    exit(0);  }    if ((in = fopen(infile, "r")) == NULL) {    perror("open");    fprintf(stderr, "Cannot open input file %s\n", infile);    exit(1);   }  if ((vme = open(vmedev, O_RDWR)) == -1) {    fprintf(stderr, "Cannot open vme as %s\n", vmedev);  }  while (fscanf(in, "%s", &inpstr) != EOF) {    line++;    if (validrec(inpstr) == 0) {      switch (issrec(inpstr)) {      case 0 :         hdr2str(inpstr, hdrstr);        if (verbose) printf("HEADER string = `%s'\n", hdrstr);        lastrec=HEADER;        break;      case 1 :         addr = getaddr(inpstr);        size = datasize(inpstr);        if (blksize == 0) {          blksize+=size;          naddr=addr+size;          if (verbose) printf("DATA\tS19\t$%04lX", addr);          lastrec=DATA19;        }        else if ((blksize!=0) && (addr==naddr)) {          blksize+=size;          naddr=addr+size;        }        else {          if (verbose) printf("\t$%04lX\t%lu", naddr-1, blksize);          if (verbose) printf("\t%d\n", blknum);          blknum+=1;          naddr=addr+size;          blksize=size;          if (verbose) printf("DATA\tS19\t$%04lX", addr);          lastrec=DATA19;        }        tsize += size;        if (vme == -1) break;        for (i = 0, j = 8, k = size; k-- > 0; i += 1, j += 2) {          image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]);        }        if (lseek(vme, addr, SEEK_SET) == -1) {          fprintf(stderr, "lseek() to vme address %08X failed\n", addr);        }        else {          if (write(vme, (u_char *)image, size) != size) {            fprintf(stderr, "Write to vme address %08X failed\n", addr);          }        }        break;      case 2 :         addr = getaddr(inpstr);        size = datasize(inpstr);        if (blksize == 0) {          blksize+=size;          naddr=addr+size;          if (verbose) printf("DATA\tS28\t$%06lX",addr);          lastrec=DATA28;        }        else if ((blksize!=0) && (addr==naddr)) {          blksize+=size;          naddr=addr+size;        }        else {          if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);          if (verbose) printf("\t%d\n",blknum);          blknum+=1;          naddr=addr+size;          blksize=size;          if (verbose) printf("DATA\tS28\t$%06lX",addr);          lastrec=DATA28;        }        tsize += size;        if (vme == -1) break;        for (i = 0, j = 10, k = size; k-- > 0; i += 1, j += 2) {          image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]);        }        if (lseek(vme, addr, SEEK_SET) == -1) {          fprintf(stderr, "lseek() to vme address %08X failed\n", addr);        }        else {          if (write(vme, (u_char *)image, size) != size) {            fprintf(stderr, "Write to vme address %08X failed\n", addr);          }        }        break;      case 3 :         addr = getaddr(inpstr);        size = datasize(inpstr);        if (blksize == 0) {          blksize+=size;          naddr=addr+size;          if (verbose) printf("DATA\tS37\t$%08lX",addr);          lastrec=DATA37;        }        else if ((blksize!=0) && (addr==naddr)) {          blksize+=size;          naddr=addr+size;        }        else {          if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);          if (verbose) printf("\t%d\n",blknum);          blknum+=1;          naddr=addr+size;          blksize=size;          if (verbose) printf("DATA\tS37\t$%08lX",addr);          lastrec=DATA37;        }        tsize += size;        if (vme == -1) break;        for (i = 0, j = 12, k = size; k-- > 0; i += 1, j += 2) {          image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]);        }        if (lseek(vme, addr, SEEK_SET) == -1) {          fprintf(stderr, "lseek() to vme address %08X failed\n", addr);        }        else {          if (write(vme, (u_char *)image, size) != size) {            fprintf(stderr, "Write to vme address %08X failed\n", addr);          }        }        break;      case 7 :         if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);}        if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);}        if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);}        if (verbose) printf("\t%d\n",blknum);        addr = getaddr(inpstr);        if (verbose) printf("TERM\tS37");        printf("\nExecution address = $%08lX\n", addr);        lastrec=TERMINATOR;        break;      case 8 :         if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);}        if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);}        if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);}        if (verbose) printf("\t%d\n",blknum);        addr = getaddr(inpstr);        if (verbose) printf("TERM\tS28");        printf("\nExecution address = $%06lX\n", addr);        lastrec=TERMINATOR;        break;      case 9 :         if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);}        if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);}        if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);}        if (verbose) printf("\t%d\n",blknum);        addr = getaddr(inpstr);        if (verbose) printf("TERM\tS19");        printf("\nExecution address = $%04lX\n", addr);        lastrec=TERMINATOR;        break;      }    }    else {      printf("\nError on line %d. ",line);      switch (validrec(inpstr)) {      case -1 : {printf("SRecord contains invalid characters.\n"); break; }      case -2 : {printf("SRecord checksum is invalid.\n"); break;}      case -3 : {printf("SRecord length is invalid.\n"); break;}      }      exit(1);    }  }  if ((lastrec==DATA19) || (lastrec==DATA28) || (lastrec==DATA37)) {    if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);}    if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);}    if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);}    if (verbose) printf("\t%d\n",blknum);    printf("ERROR: terminator record not found.\n");  }  else {    for (i = 0x000FFFF; i-- > 0;) ;           /* mystique delay... */    MVMEControl(addr, reset, go);  }  if (verbose) printf("total data size = %lu bytes\n", tsize);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -