OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

[/] [eco32/] [trunk/] [tools/] [bit2exo/] [bit2exo.c] - Rev 45

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 * bit2exo.c -- convert Xilinx bitfile data to Motorola S-records
 */
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
 
 
unsigned char bitHeader[13] = {
  0x00, 0x09, 0x0F, 0xF0,
  0x0F, 0xF0, 0x0F, 0xF0,
  0x0F, 0xF0, 0x00, 0x00,
  0x01
};
 
 
void error(char *fmt, ...) {
  va_list ap;
 
  va_start(ap, fmt);
  printf("Error: ");
  vprintf(fmt, ap);
  printf("\n");
  va_end(ap);
  exit(1);
}
 
 
unsigned int getCount2(FILE *infile) {
  unsigned char b1, b2;
 
  b1 = fgetc(infile);
  b2 = fgetc(infile);
  return ((unsigned int) b1 << 8) | (unsigned int) b2;
}
 
 
unsigned int getCount4(FILE *infile) {
  unsigned char b1, b2, b3, b4;
 
  b1 = fgetc(infile);
  b2 = fgetc(infile);
  b3 = fgetc(infile);
  b4 = fgetc(infile);
  return ((unsigned int) b1 << 24) | ((unsigned int) b2 << 16) |
         ((unsigned int) b3 <<  8) | ((unsigned int) b4 <<  0);
}
 
 
void show(char *name, FILE *infile, int count) {
  int c;
 
  printf("%s", name);
  while (count--) {
    c = fgetc(infile);
    if (c >= 0x20 && c <= 0x7E) {
      printf("%c", c);
    }
  }
  printf("\n");
}
 
 
unsigned char mirror(unsigned char n) {
  unsigned char m;
  int i;
 
  m = 0;
  for (i = 0; i < 8; i++) {
    m <<= 1;
    if (n & 1) {
      m |= 1;
    }
    n >>= 1;
  }
  return m;
}
 
 
int main(int argc, char *argv[]) {
  char *endptr;
  unsigned int loadAddr;
  FILE *infile;
  FILE *outfile;
  int numBytes, i;
  int c;
  unsigned char lineData[16];
  unsigned int chksum;
  int totalBytes;
 
  if (argc != 4) {
    printf("Usage: %s <load addr, hex> <input file> <output file>\n",
           argv[0]);
    printf("    ROM quadrant 0: load addr = 0x000000\n");
    printf("    ROM quadrant 1: load addr = 0x080000\n");
    printf("    ROM quadrant 2: load addr = 0x100000\n");
    printf("    ROM quadrant 3: load addr = 0x180000\n");
    exit(1);
  }
  loadAddr = strtoul(argv[1], &endptr, 16);
  if (*endptr != '\0') {
    error("illegal load address %s", argv[1]);
  }
  infile = fopen(argv[2], "rb");
  if (infile == NULL) {
    error("cannot open input file %s", argv[2]);
  }
  outfile = fopen(argv[3], "wt");
  if (outfile == NULL) {
    error("cannot open output file %s", argv[3]);
  }
  /* 13 bytes header */
  for (i = 0; i < 13; i++) {
    if (fgetc(infile) != bitHeader[i]) {
      error("input file header is not a '.bit' header");
    }
  }
  /* section 'a' */
  if (fgetc(infile) != 'a') {
    error("section 'a' not found");
  }
  i = getCount2(infile);
  show("design name:\t\t", infile, i);
  /* section 'b' */
  if (fgetc(infile) != 'b') {
    error("section 'b' not found");
  }
  i = getCount2(infile);
  show("part name:\t\t", infile, i);
  /* section 'c' */
  if (fgetc(infile) != 'c') {
    error("section 'c' not found");
  }
  i = getCount2(infile);
  show("creation date:\t\t", infile, i);
  /* section 'd' */
  if (fgetc(infile) != 'd') {
    error("section 'd' not found");
  }
  i = getCount2(infile);
  show("creation time:\t\t", infile, i);
  /* section 'e' */
  if (fgetc(infile) != 'e') {
    error("section 'e' not found");
  }
  i = getCount4(infile);
  printf("bit stream size:\t0x%08X\n", i);
  totalBytes = 0;
  while (1) {
    chksum = 0;
    for (numBytes = 0; numBytes < 16; numBytes++) {
      c = fgetc(infile);
      if (c == EOF) {
        break;
      }
      c = mirror(c & 0xFF);
      lineData[numBytes] = c;
      chksum += c;
    }
    if (numBytes == 0) {
      break;
    }
    totalBytes += numBytes;
    fprintf(outfile, "S2%02X%06X", numBytes + 4, loadAddr);
    for (i = 0; i < numBytes; i++) {
      fprintf(outfile, "%02X", lineData[i]);
    }
    chksum += numBytes + 4;
    chksum += ((loadAddr >>  0) & 0xFF) +
              ((loadAddr >>  8) & 0xFF) +
              ((loadAddr >> 16) & 0xFF);
    fprintf(outfile, "%02X\n", 0xFF - (chksum & 0xFF));
    loadAddr += numBytes;
    if (c == EOF) {
      break;
    }
  }
  fprintf(outfile, "S804000000FB\n");
  fclose(infile);
  fclose(outfile);
  printf("bytes converted:\t0x%08X\n", totalBytes);
  return 0;
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.