Exemplo n.º 1
0
Arquivo: dump.c Projeto: abbrev/xs
int
main (int argc, char **argv)
{
    FILE *file;
    char buf[256];
    int line = 0;
    srec_t srec;

    if (argc != 2) 
	fatal("usage: %s filename\n", argv[0]);

    if (!(file = fopen(argv[1], "r")))
	fatal("%s: couldn't open\n", argv[1]);

    while (fgets(buf, sizeof(buf), file)) {
	int error;
	line++;
	if ((error = srec_decode(&srec, buf)) < 0) {
	    if (error != S_INVALID_CKSUM) {
		fatal("%s: %s on line %d\n",
		      argv[1], srec_strerror(error), line);
	    }
	}
	if (srec.type == 0) {
	    srec.data[srec.count] = '\0';
	    printf("S0: %s\n", srec.data);
	}
    }
}
Exemplo n.º 2
0
int srec_read (FILE *file, int start) {
    char buf[256];
    srec_t srec;
    int line = 0;
    int entry = 0;

    /* Read image file */
    while (fgets(buf, sizeof(buf), file)) {
	int error, i;
	line++;
	/* Skip blank lines */
	for (i = 0; buf[i]; i++)
	    if (!isspace(buf[i]))
		break;
	if (!buf[i])
	    continue;
	/* Decode line */
	if ((error = srec_decode(&srec, buf)) < 0) {
	    if (error != SREC_INVALID_CKSUM) {
		fprintf(stderr, "firmware: %s on line %d\n",
			srec_strerror(error), line);
		return -1;
	    }
	}
	/* Process s-record data */
	if (srec.type == 1) {
	    memcpy(&memory[srec.addr], &srec.data, srec.count);
	}
	/* Process image starting address */
	else if (srec.type == 9) {
	    entry = srec.addr;
	}
    }

    return entry;
}
Exemplo n.º 3
0
int srec_load (char *name, unsigned char *image, int maxlen, unsigned short *start)
{
    FILE *file;
    char buf[256];
    srec_t srec;
    int line = 0;
    int length = 0;
    int strip = 0;

    /* Initialize starting address */
    *start = IMAGE_START;

    /* Open file */
    if ((file = fopen(name, "r")) == NULL) {
	fprintf(stderr, "%s: failed to open\n", name);
	exit(1);
    }

    /* Clear image to zero */
    memset(image, 0, maxlen);

    /* Read image file */
    while (fgets(buf, sizeof(buf), file)) {
	int error, i;
	line++;
	/* Skip blank lines */
	for (i = 0; buf[i]; i++)
	    if (!isspace(buf[i]))
		break;
	if (!buf[i])
	    continue;
	/* Decode line */
	if ((error = srec_decode(&srec, buf)) < 0) {
	    if (error != SREC_INVALID_CKSUM) {
		fprintf(stderr, "%s: %s on line %d\n",
			name, srec_strerror(error), line);
		exit(1);
	    }
	}
	/* Detect Firm0309.lgo header, set strip=1 if found */
	if (srec.type == 0) {
	    if (srec.count == 16)
		if (!strncmp(srec.data, "?LIB_VERSION_L00", 16))
		    strip = 1;
	}
	/* Process s-record data */
	else if (srec.type == 1) {
	    if (srec.addr < IMAGE_START ||
		srec.addr + srec.count > IMAGE_START + maxlen) {
		fprintf(stderr, "%s: address out of bounds on line %d\n",
			name, line);
		exit(1);
	    }
	    if (srec.addr + srec.count - IMAGE_START > length)
		length = srec.addr + srec.count - IMAGE_START;
	    memcpy(&image[srec.addr - IMAGE_START], &srec.data, srec.count);
	}
	/* Process image starting address */
	else if (srec.type == 9) {
	    if (srec.addr < IMAGE_START ||
		srec.addr > IMAGE_START + maxlen) {
		fprintf(stderr, "%s: address out of bounds on line %d\n",
			name, line);
		exit(1);
	    }
	    *start = srec.addr;
	}
    }

    /* Strip zeros */
#ifdef FORCE_ZERO_STRIPPING
    strip = 1;
#endif

    if (strip) {
	int pos;
	for (pos = IMAGE_MAXLEN - 1; pos >= 0 && image[pos] == 0; pos--);
	length = pos + 1;
    }

    /* Check length */
    if (length == 0) {
	fprintf(stderr, "%s: image contains no data\n", name);
	exit(1);
    }

    return length;
}