mirror of
https://github.com/fail0verflow/switch-coreboot.git
synced 2025-05-04 01:39:18 -04:00
Remove the unneeded mkrom utility
This commit is contained in:
parent
4687184cfa
commit
c24de9ffa9
4 changed files with 0 additions and 1065 deletions
|
@ -1,9 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
makerule makerom: commlib.a makerom.o compress.o ; $(CC) -o makerom makerom.o compress.o commlib.a
|
|
||||||
|
|
||||||
makerule makerom.o: $(TOP)/util/makerom/makerom.c ; $(CC) -c -I$(TOP)/util/alpha-common/include $(TOP)/util/makerom/makerom.c
|
|
||||||
|
|
||||||
makerule compress.o: $(TOP)/util/makerom/compress.c ; $(CC) -c -I$(TOP)/util/alpha-common/include $(TOP)/util/makerom/compress.c
|
|
||||||
|
|
||||||
dir /util/alpha-common
|
|
|
@ -1,33 +0,0 @@
|
||||||
PROG = makerom
|
|
||||||
OBJS = makerom.o compress.o
|
|
||||||
|
|
||||||
COMMON = ../common
|
|
||||||
COMMONLIB = $(COMMON)/commlib.a
|
|
||||||
|
|
||||||
BIN = ../bin
|
|
||||||
|
|
||||||
CC = gcc
|
|
||||||
STRIP = strip
|
|
||||||
CHMOD = chmod
|
|
||||||
RM = rm -f
|
|
||||||
CP = cp -fp
|
|
||||||
|
|
||||||
CFLAGS = -O2
|
|
||||||
INCLUDES = -I../include
|
|
||||||
|
|
||||||
all: $(PROG)
|
|
||||||
|
|
||||||
$(PROG): $(OBJS) $(COMMONLIB)
|
|
||||||
$(CC) -o $(PROG) $(OBJS) $(COMMONLIB)
|
|
||||||
$(STRIP) $(PROG)
|
|
||||||
|
|
||||||
install: $(PROG)
|
|
||||||
$(CP) $(PROG) $(BIN)
|
|
||||||
$(CHMOD) 775 $(BIN)/$(PROG)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(BIN)/$(PROG) $(PROG) *.o *~
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -c -o $*.o $<
|
|
||||||
|
|
|
@ -1,348 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Copyright © 1994, Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted, provided
|
|
||||||
that the copyright notice and this permission notice appear in all copies
|
|
||||||
of software and supporting documentation, and that the name of Digital not
|
|
||||||
be used in advertising or publicity pertaining to distribution of the software
|
|
||||||
without specific, written prior permission. Digital grants this permission
|
|
||||||
provided that you prominently mark, as not part of the original, any
|
|
||||||
modifications made to this software or documentation.
|
|
||||||
|
|
||||||
Digital Equipment Corporation disclaims all warranties and/or guarantees
|
|
||||||
with regard to this software, including all implied warranties of fitness for
|
|
||||||
a particular purpose and merchantability, and makes no representations
|
|
||||||
regarding the use of, or the results of the use of, the software and
|
|
||||||
documentation in terms of correctness, accuracy, reliability, currentness or
|
|
||||||
otherwise; and you rely on the software, documentation and results solely at
|
|
||||||
your own risk.
|
|
||||||
|
|
||||||
******************************************************************************/
|
|
||||||
/*
|
|
||||||
**
|
|
||||||
** FACILITY:
|
|
||||||
**
|
|
||||||
** EBxx Software Tools - makerom
|
|
||||||
**
|
|
||||||
** FUNCTIONAL DESCRIPTION:
|
|
||||||
**
|
|
||||||
** Makerom makes roms. It takes a series of input files
|
|
||||||
** adds headers to them and outputs them either compressed
|
|
||||||
** or uncompressed (the default). This module contains the
|
|
||||||
** compressioin code.
|
|
||||||
**
|
|
||||||
** CALLING ENVIRONMENT:
|
|
||||||
**
|
|
||||||
** user mode
|
|
||||||
**
|
|
||||||
** AUTHOR: David A Rusling
|
|
||||||
**
|
|
||||||
** CREATION-DATE: 04-Feb-1994
|
|
||||||
**
|
|
||||||
** MODIFIED BY:
|
|
||||||
**
|
|
||||||
*/
|
|
||||||
#ifndef lint
|
|
||||||
static char *RCSid = "$Id$";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* $Log$
|
|
||||||
* Revision 1.1 2001/03/22 21:26:32 rminnich
|
|
||||||
* testing I HATE CVS
|
|
||||||
*
|
|
||||||
* Revision 1.1 2000/03/21 03:56:31 stepan
|
|
||||||
* Check in current version which is a nearly a 2.2-16
|
|
||||||
*
|
|
||||||
* Revision 1.9 1995/03/04 05:54:15 fdh
|
|
||||||
* Keep track of output size.
|
|
||||||
* Use the pre-defined macros for computing checksum.
|
|
||||||
*
|
|
||||||
* Revision 1.8 1995/02/08 01:22:40 fdh
|
|
||||||
* Pad to longword align the end of the ROM image.
|
|
||||||
*
|
|
||||||
* Revision 1.7 1995/02/07 01:01:12 fdh
|
|
||||||
* Removed some unnecessary definitions.
|
|
||||||
*
|
|
||||||
* Revision 1.6 1995/02/05 02:02:07 fdh
|
|
||||||
* Modified to accept the latest romheader definition.
|
|
||||||
*
|
|
||||||
* Revision 1.5 1995/02/02 20:28:03 fdh
|
|
||||||
* Wrapped _fputc() with output_c() to keep count of the
|
|
||||||
* bytes written.
|
|
||||||
* Modified to work in two passes with conditional
|
|
||||||
* output enable.
|
|
||||||
*
|
|
||||||
* Revision 1.4 1994/07/04 10:58:22 rusling
|
|
||||||
* Fixed WNT compile warnings.
|
|
||||||
*
|
|
||||||
* Revision 1.3 1994/04/19 12:37:53 rusling
|
|
||||||
* Fixed up compression message.
|
|
||||||
*
|
|
||||||
* Revision 1.2 1994/03/03 16:15:38 rusling
|
|
||||||
* Fixed bug.
|
|
||||||
*
|
|
||||||
* Revision 1.5 1994/02/04 11:51:26 rusling
|
|
||||||
* Ported to Alpha WNT.
|
|
||||||
*
|
|
||||||
* Revision 1.3 1994/02/04 11:22:35 rusling
|
|
||||||
* Fixed but (not resetting index) in push() when
|
|
||||||
* we flush some of the stack.
|
|
||||||
*
|
|
||||||
* Revision 1.2 1994/02/04 10:17:26 rusling
|
|
||||||
* Added RCS bits to the file.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "c_32_64.h"
|
|
||||||
#include "romhead.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Function prototypes
|
|
||||||
*/
|
|
||||||
extern int compress(FILE * in , FILE * out);
|
|
||||||
static int pop(void);
|
|
||||||
static void flush(FILE * out);
|
|
||||||
static void push(int c , FILE * out);
|
|
||||||
static void Repeater(int c , int repeat , FILE * out);
|
|
||||||
static void output_c(int c , FILE * f);
|
|
||||||
|
|
||||||
#define MAXDIFFERENT 127
|
|
||||||
#define MAXREPEAT 128
|
|
||||||
#define MINREPEAT 2 /* As when this is output as
|
|
||||||
a repeated record, then the
|
|
||||||
output is no longer than the
|
|
||||||
input */
|
|
||||||
|
|
||||||
#define _minimum(a,b) ((a < b)? (a) : (b))
|
|
||||||
#define _maximum(a,b) ((a > b)? (a) : (b))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Global variables used by the helper routines.
|
|
||||||
*/
|
|
||||||
#define MAXBUFFER (2 * (MINREPEAT + MAXDIFFERENT))
|
|
||||||
int buffer[MAXBUFFER];
|
|
||||||
int idx = 0;
|
|
||||||
extern int output_enable;
|
|
||||||
extern romheader_t head;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Global values used by statistics gatherers.
|
|
||||||
*/
|
|
||||||
int ccount;
|
|
||||||
int ocount;
|
|
||||||
int rrecords;
|
|
||||||
int nrecords;
|
|
||||||
int toosmall;
|
|
||||||
/*****************************************************
|
|
||||||
* Helper routines maintaining a stack. *
|
|
||||||
*****************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Pop the top charater off of the stack.
|
|
||||||
*/
|
|
||||||
static int pop()
|
|
||||||
{
|
|
||||||
if (idx != 0)
|
|
||||||
return buffer[idx--];
|
|
||||||
else {
|
|
||||||
fprintf(stderr, "ERROR: attempting to pop an empty stack\n");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flush the stack out as a series of non
|
|
||||||
* repeating records of maximum size MAXDIFFERENT.
|
|
||||||
*/
|
|
||||||
static void flush(FILE *out)
|
|
||||||
{
|
|
||||||
int i = 0, j;
|
|
||||||
|
|
||||||
while (idx > i) {
|
|
||||||
j = 0;
|
|
||||||
output_c(_minimum(MAXDIFFERENT, idx - i), out);
|
|
||||||
while (j < _minimum(MAXDIFFERENT, idx - i)) {
|
|
||||||
output_c(buffer[i + (j++)], out);
|
|
||||||
}
|
|
||||||
nrecords++;
|
|
||||||
i = i + MAXDIFFERENT;
|
|
||||||
}
|
|
||||||
idx = 0;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Push a character onto the stack, if it gets full
|
|
||||||
* then flush it. The last character must be available.
|
|
||||||
* This is wy we pass in the output file stream pointer.
|
|
||||||
*/
|
|
||||||
static void push(int c, FILE *out)
|
|
||||||
{
|
|
||||||
if (idx == MAXBUFFER)
|
|
||||||
flush(out);
|
|
||||||
|
|
||||||
buffer[idx++] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print out a series of repeater records.
|
|
||||||
*/
|
|
||||||
static void Repeater(int c, int repeat, FILE *out)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
while (repeat > i) {
|
|
||||||
output_c(-(_minimum(MAXREPEAT, repeat - i)), out);
|
|
||||||
output_c(c, out);
|
|
||||||
rrecords++;
|
|
||||||
i = i + MAXREPEAT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int compress(FILE *in, FILE *out)
|
|
||||||
{
|
|
||||||
int last, this;
|
|
||||||
int padding;
|
|
||||||
|
|
||||||
#define REPEATING 1
|
|
||||||
#define NONE 0
|
|
||||||
int state = NONE;
|
|
||||||
int repeat = 0;
|
|
||||||
float compression;
|
|
||||||
|
|
||||||
ccount = 0;
|
|
||||||
ocount = 0;
|
|
||||||
rrecords = 0;
|
|
||||||
nrecords = 0;
|
|
||||||
toosmall = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the input stream byte by byte writing
|
|
||||||
* compression records. These are either repeating records
|
|
||||||
* or non-repeating records. Finally, output an end of
|
|
||||||
* file record (0).
|
|
||||||
*/
|
|
||||||
last = getc(in);
|
|
||||||
push(last, out);
|
|
||||||
ccount++;
|
|
||||||
|
|
||||||
this = getc(in);
|
|
||||||
while (!feof(in)) {
|
|
||||||
ccount++;
|
|
||||||
if (state == REPEATING) {
|
|
||||||
/*
|
|
||||||
* At least the last two characters were the same. If this
|
|
||||||
* one is then we're still in a run of the same character
|
|
||||||
* (which is "last"). However, if it's different, then
|
|
||||||
* we've reached the end of the repeat run.
|
|
||||||
*/
|
|
||||||
if (last == this) {
|
|
||||||
repeat++;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* We've reached the end of a repeating string of character
|
|
||||||
* "last". If this repeat string is not long enough, then do
|
|
||||||
* not worry about, just stick it on the stack, otherwise
|
|
||||||
* put out whatever was before the repeated character and
|
|
||||||
* then put out a repeat record.
|
|
||||||
*/
|
|
||||||
state = NONE;
|
|
||||||
if (repeat < MINREPEAT+1) {
|
|
||||||
toosmall++;
|
|
||||||
while (repeat--)
|
|
||||||
push(last, out);
|
|
||||||
} else {
|
|
||||||
flush(out); /* flush the non-repeating record
|
|
||||||
* before we got to the repetitive
|
|
||||||
* character */
|
|
||||||
Repeater(last, repeat, out);
|
|
||||||
/* write out the repeater record */
|
|
||||||
repeat = 0;
|
|
||||||
}
|
|
||||||
push(this, out);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* We're just bumbling along seeing different characters
|
|
||||||
* all the time. If we see the same character as last time,
|
|
||||||
* then we change our state to repeating and take that
|
|
||||||
* last character off of the stack. Otherwise we just
|
|
||||||
* carry on pushing characters onto the stack. When the
|
|
||||||
* stack fills, then it will be emptied as non-repeating
|
|
||||||
* records by flush().
|
|
||||||
*/
|
|
||||||
if (last == this) {
|
|
||||||
state = REPEATING;
|
|
||||||
pop(); /* don't put repeating chars on the
|
|
||||||
* stack, we did, so take it off! */
|
|
||||||
repeat = 2; /* this one and the last one! */
|
|
||||||
} else {
|
|
||||||
push(this, out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
last = this;
|
|
||||||
this = getc(in);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Flush whatever is lying in the stack as non-repeating
|
|
||||||
* records. Then put out any repeat record.
|
|
||||||
*/
|
|
||||||
flush(out);
|
|
||||||
Repeater(last, repeat, out);
|
|
||||||
/*
|
|
||||||
* Print out the end of file record.
|
|
||||||
*/
|
|
||||||
output_c(0, out);
|
|
||||||
|
|
||||||
/* Pad to longword align the end of the file */
|
|
||||||
padding = 0;
|
|
||||||
while((ocount%4) != 0) {
|
|
||||||
output_c(0, out);
|
|
||||||
++padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print on 2nd pass if necessary */
|
|
||||||
if ((output_enable) && (padding))
|
|
||||||
printf(" Image padded by %d bytes\n", padding);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now tell the user what happened.
|
|
||||||
*/
|
|
||||||
if (output_enable) {
|
|
||||||
compression = (float)(ccount - ocount) / ((float)ccount) * 100;
|
|
||||||
fprintf(stderr, "...Compression Statistics:\n");
|
|
||||||
fprintf(stderr, "\tinput char count = %d,", ccount);
|
|
||||||
fprintf(stderr, "output char count = %d,\n", ocount);
|
|
||||||
fprintf(stderr, "\tCompression = %2.2f%%\n", compression);
|
|
||||||
fprintf(stderr, "\trepeating records = %d,", rrecords);
|
|
||||||
fprintf(stderr, "non-repeating records = %d\n", nrecords);
|
|
||||||
fprintf(stderr, "\trepeated strings less than minimum (%d) = %d\n\n",
|
|
||||||
MINREPEAT, toosmall);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Return the total bytes written to the caller.
|
|
||||||
*/
|
|
||||||
return ocount;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Control output of characters and compute
|
|
||||||
* checksum and size.
|
|
||||||
*/
|
|
||||||
static void output_c(int c, FILE* f)
|
|
||||||
{
|
|
||||||
ocount++;
|
|
||||||
if (output_enable)
|
|
||||||
fputc(c,f);
|
|
||||||
else
|
|
||||||
COMPUTE_CHECKSUM(c, head.romh.V0.checksum)
|
|
||||||
}
|
|
|
@ -1,675 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Copyright © 1994, Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted, provided
|
|
||||||
that the copyright notice and this permission notice appear in all copies
|
|
||||||
of software and supporting documentation, and that the name of Digital not
|
|
||||||
be used in advertising or publicity pertaining to distribution of the software
|
|
||||||
without specific, written prior permission. Digital grants this permission
|
|
||||||
provided that you prominently mark, as not part of the original, any
|
|
||||||
modifications made to this software or documentation.
|
|
||||||
|
|
||||||
Digital Equipment Corporation disclaims all warranties and/or guarantees
|
|
||||||
with regard to this software, including all implied warranties of fitness for
|
|
||||||
a particular purpose and merchantability, and makes no representations
|
|
||||||
regarding the use of, or the results of the use of, the software and
|
|
||||||
documentation in terms of correctness, accuracy, reliability, currentness or
|
|
||||||
otherwise; and you rely on the software, documentation and results solely at
|
|
||||||
your own risk.
|
|
||||||
|
|
||||||
******************************************************************************/
|
|
||||||
/*
|
|
||||||
**
|
|
||||||
** FACILITY:
|
|
||||||
**
|
|
||||||
** EBxx Software Tools - makerom
|
|
||||||
**
|
|
||||||
** FUNCTIONAL DESCRIPTION:
|
|
||||||
**
|
|
||||||
** Makerom makes roms. It takes a series of input files
|
|
||||||
** adds headers to them and outputs them either compressed
|
|
||||||
** or uncompressed (the default). This module contains the
|
|
||||||
** command parsing code.
|
|
||||||
**
|
|
||||||
** CALLING ENVIRONMENT:
|
|
||||||
**
|
|
||||||
** user mode
|
|
||||||
**
|
|
||||||
** AUTHOR: David A Rusling
|
|
||||||
**
|
|
||||||
** CREATION-DATE: 04-Feb-1994
|
|
||||||
**
|
|
||||||
** MODIFIED BY:
|
|
||||||
**
|
|
||||||
*/
|
|
||||||
#ifndef lint
|
|
||||||
static char *RCSid =
|
|
||||||
"$Id$";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* $Log$
|
|
||||||
* Revision 1.1 2001/03/22 21:26:32 rminnich
|
|
||||||
* testing I HATE CVS
|
|
||||||
*
|
|
||||||
* Revision 1.1 2000/03/21 03:56:31 stepan
|
|
||||||
* Check in current version which is a nearly a 2.2-16
|
|
||||||
*
|
|
||||||
* Revision 1.18 1995/02/27 15:34:24 fdh
|
|
||||||
* Modified to not use 64 bit ints for portability.
|
|
||||||
*
|
|
||||||
* Revision 1.17 1995/02/25 05:14:40 fdh
|
|
||||||
* Clean up handling of options with 64bit quantities.
|
|
||||||
* Updated usage().
|
|
||||||
*
|
|
||||||
* Revision 1.16 1995/02/16 20:45:46 fdh
|
|
||||||
* Inform user when image is padded.
|
|
||||||
*
|
|
||||||
* Revision 1.15 1995/02/10 15:44:47 fdh
|
|
||||||
* Modified image size to reflect the size after any necessary
|
|
||||||
* padding is added to align to a 32 bit boundary.
|
|
||||||
*
|
|
||||||
* Revision 1.14 1995/02/10 02:10:40 fdh
|
|
||||||
* Modified to use the COMPUTE_CHECKSUM Macro.
|
|
||||||
*
|
|
||||||
* Revision 1.13 1995/02/09 23:38:40 fdh
|
|
||||||
* Corrected char sign extension problem when computing
|
|
||||||
* checksums.
|
|
||||||
* Print out standard header summary.
|
|
||||||
*
|
|
||||||
* Revision 1.12 1995/02/08 01:23:15 fdh
|
|
||||||
* Pad to longword align the ROM image.
|
|
||||||
* ROTATE_RIGHT macro was moved to romhead.h.
|
|
||||||
*
|
|
||||||
* Revision 1.11 1995/02/07 23:16:06 fdh
|
|
||||||
* Modified the -x and -f options to work with 32 bit OS's.
|
|
||||||
*
|
|
||||||
* Revision 1.10 1995/02/07 04:51:37 fdh
|
|
||||||
* Modified to work with a change to fwid_match_i().
|
|
||||||
*
|
|
||||||
* Revision 1.9 1995/02/07 01:00:22 fdh
|
|
||||||
* Corrected header size computation.
|
|
||||||
* Corrected comments.
|
|
||||||
*
|
|
||||||
* Revision 1.8 1995/02/06 02:42:36 fdh
|
|
||||||
* Moved some code to library file routines
|
|
||||||
* fwid_match(), fwid_match_i(), and fwid_dump().
|
|
||||||
*
|
|
||||||
* Revision 1.7 1995/02/05 02:01:10 fdh
|
|
||||||
* Modified to accept the latest romheader definition.
|
|
||||||
*
|
|
||||||
* Revision 1.6 1995/02/02 20:19:28 fdh
|
|
||||||
* Modified to use ROM header version 1.
|
|
||||||
* Computes header and image checksums.
|
|
||||||
* Added -s -x and -f switches to specify user
|
|
||||||
* optional revision data in the header.
|
|
||||||
* Added -i switch used to specify the firmware
|
|
||||||
* ID type as either a registered string, registered
|
|
||||||
* number, or unregistered number.
|
|
||||||
*
|
|
||||||
* Revision 1.5 1995/01/23 21:23:46 fdh
|
|
||||||
* Modified to use common include file "romhead.h"
|
|
||||||
*
|
|
||||||
* Revision 1.4 1994/07/01 14:23:56 rusling
|
|
||||||
* Fixed up NT warnings.
|
|
||||||
*
|
|
||||||
* Revision 1.3 1994/03/03 16:26:09 rusling
|
|
||||||
* Fixed help text.
|
|
||||||
*
|
|
||||||
* Revision 1.6 1994/02/04 11:51:35 rusling
|
|
||||||
* Ported to Alpha WNT.
|
|
||||||
*
|
|
||||||
* Revision 1.5 1994/02/04 11:39:03 rusling
|
|
||||||
* Oops.
|
|
||||||
*
|
|
||||||
* Revision 1.3 1994/02/04 10:17:47 rusling
|
|
||||||
* Added RCS bits to the file.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "c_32_64.h"
|
|
||||||
#include "romhead.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros
|
|
||||||
*/
|
|
||||||
#define TRUE 1
|
|
||||||
#define FALSE 0
|
|
||||||
#define BLOCK_SIZE 1000
|
|
||||||
|
|
||||||
|
|
||||||
#define _SEEN(o) seen[o-'a']
|
|
||||||
#define _OPTION(o) (_SEEN(o) == TRUE)
|
|
||||||
|
|
||||||
romheader_t head;
|
|
||||||
|
|
||||||
typedef struct fileinfo {
|
|
||||||
struct fileinfo *next; /* next file in the list */
|
|
||||||
char *file;
|
|
||||||
struct {
|
|
||||||
ui low;
|
|
||||||
ui high;
|
|
||||||
} load; /* load point for this file */
|
|
||||||
int32 compress; /* Should we compress this file? */
|
|
||||||
int32 size; /* size of the file */
|
|
||||||
int32 padding; /* padding required to longword align at the end of the file */
|
|
||||||
int32 outputfile; /* is this an output file? */
|
|
||||||
fw_id_t *fwid_ptr; /* Points to a predefined table */
|
|
||||||
int fwid_alt; /* Used when user specified */
|
|
||||||
union int_char {
|
|
||||||
char ch[8];
|
|
||||||
struct {
|
|
||||||
ui low;
|
|
||||||
ui high;
|
|
||||||
} data;
|
|
||||||
} fwid_optional;
|
|
||||||
} fileinfo_t;
|
|
||||||
fileinfo_t *files = NULL;
|
|
||||||
fileinfo_t *last = NULL;
|
|
||||||
int32 fcount = 0;
|
|
||||||
|
|
||||||
|
|
||||||
int output_enable = 0;
|
|
||||||
/*
|
|
||||||
* Global data (all names preceded by 'rhdr_g'.
|
|
||||||
*/
|
|
||||||
#define SEEN_SIZE 100
|
|
||||||
char seen[SEEN_SIZE]; /* upper and lower case */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Forward routine descriptions.
|
|
||||||
*/
|
|
||||||
fileinfo_t *allocate_fileinfo();
|
|
||||||
int main(int argc, char **argv);
|
|
||||||
void process_file(fileinfo_t *ifile, FILE *out);
|
|
||||||
void usage();
|
|
||||||
void read_file(char *filename);
|
|
||||||
void write_file(char *filename);
|
|
||||||
int32 fsize(FILE *file);
|
|
||||||
/*
|
|
||||||
* External routines.
|
|
||||||
*/
|
|
||||||
extern int compress(FILE *in, FILE *out);
|
|
||||||
|
|
||||||
fileinfo_t *allocate_fileinfo()
|
|
||||||
{
|
|
||||||
fileinfo_t *file;
|
|
||||||
|
|
||||||
file = (fileinfo_t *) malloc(sizeof(fileinfo_t));
|
|
||||||
if (file == NULL) {
|
|
||||||
fprintf(stderr, "ERROR: failed to allocate memory\n");
|
|
||||||
exit(0);
|
|
||||||
} else {
|
|
||||||
file->load.high = 0;
|
|
||||||
file->load.low = 0;
|
|
||||||
file->size = 0;
|
|
||||||
file->compress = 0; /* no compression */
|
|
||||||
file->file = NULL;
|
|
||||||
file->outputfile = FALSE;
|
|
||||||
}
|
|
||||||
fcount++;
|
|
||||||
/*
|
|
||||||
* return the address of the fileinfo structure to the
|
|
||||||
* caller.
|
|
||||||
*/
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
char *arg, option;
|
|
||||||
int i;
|
|
||||||
fileinfo_t *now, *output;
|
|
||||||
FILE *out;
|
|
||||||
|
|
||||||
for (i = 0; i < SEEN_SIZE; i++)
|
|
||||||
seen[i] = FALSE;
|
|
||||||
/*
|
|
||||||
* Allocate at least one file description block.
|
|
||||||
*/
|
|
||||||
now = last = files = allocate_fileinfo();
|
|
||||||
now->fwid_ptr = NULL;
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
usage();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Parse arguments, but we are only interested in flags.
|
|
||||||
* Skip argv[0].
|
|
||||||
*/
|
|
||||||
for (i = 1; i < argc; i++) {
|
|
||||||
arg = argv[i];
|
|
||||||
if (*arg == '-') {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is a -xyz style options list. Work out the options specified.
|
|
||||||
*/
|
|
||||||
arg++; /* skip the '-' */
|
|
||||||
while (option = *arg++) { /* until we reach the '0' string
|
|
||||||
* terminator */
|
|
||||||
switch (option) {
|
|
||||||
case 'h':
|
|
||||||
case 'H':
|
|
||||||
usage();
|
|
||||||
exit(1);
|
|
||||||
case 'v': /* verbose */
|
|
||||||
case 'V':
|
|
||||||
_SEEN(tolower(option)) = TRUE;
|
|
||||||
break;
|
|
||||||
case 'C':
|
|
||||||
case 'c':
|
|
||||||
/*
|
|
||||||
* The -C,-c option means "compress the image". The compression algorithm
|
|
||||||
* is a simple removal of repeating bytes. The decompression algorithm is
|
|
||||||
* implemented in the SROM code itself.
|
|
||||||
*/
|
|
||||||
_SEEN(tolower(option)) = TRUE;
|
|
||||||
now->compress = TRUE;
|
|
||||||
break;
|
|
||||||
case 'O':
|
|
||||||
case 'o':
|
|
||||||
/*
|
|
||||||
* This file is marked as an output file.
|
|
||||||
*/
|
|
||||||
if (_SEEN(tolower(option))) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"ERROR: two output file names given\n");
|
|
||||||
exit(0);
|
|
||||||
} else {
|
|
||||||
_SEEN(tolower(option)) = TRUE;
|
|
||||||
now->outputfile = TRUE;
|
|
||||||
}
|
|
||||||
case 'L':
|
|
||||||
case 'l':
|
|
||||||
/*
|
|
||||||
* This is a special one, the -l option is followed (immediately)
|
|
||||||
* by the address where the file should be loaded into memory.
|
|
||||||
*/
|
|
||||||
_SEEN(tolower(option)) = TRUE;
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
char strbuf[16+1];
|
|
||||||
|
|
||||||
sscanf(arg, "%16s", strbuf);
|
|
||||||
i = strlen(strbuf);
|
|
||||||
|
|
||||||
j = ((i-8)>0)?(i-8):0;
|
|
||||||
now->load.low = strtoul(&strbuf[j], NULL, 16);
|
|
||||||
strbuf[j] = '\0';
|
|
||||||
now->load.high = strtoul(strbuf, NULL, 16);
|
|
||||||
}
|
|
||||||
arg = arg + strlen(arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'I':
|
|
||||||
case 'i':
|
|
||||||
/*
|
|
||||||
* This is a special one, the -i option is followed (immediately)
|
|
||||||
* by a firmware type identifier.
|
|
||||||
*/
|
|
||||||
_SEEN(tolower(option)) = TRUE;
|
|
||||||
|
|
||||||
if ((now->fwid_ptr = fwid_match(arg)) == NULL) {
|
|
||||||
now->fwid_alt = atoi(arg);
|
|
||||||
now->fwid_ptr = fwid_match_i(now->fwid_alt);
|
|
||||||
}
|
|
||||||
|
|
||||||
arg = arg + strlen(arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'X':
|
|
||||||
case 'x':
|
|
||||||
/*
|
|
||||||
* This is a special one, the -x option is followed (immediately)
|
|
||||||
* by a Hex value, truncated to 8 digits.
|
|
||||||
*/
|
|
||||||
_SEEN(tolower(option)) = TRUE;
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
char strbuf[16+1];
|
|
||||||
|
|
||||||
sscanf(arg, "%16s", strbuf);
|
|
||||||
i = strlen(strbuf);
|
|
||||||
|
|
||||||
j = ((i-8)>0)?(i-8):0;
|
|
||||||
now->fwid_optional.data.low = strtoul(&strbuf[j], NULL, 16);
|
|
||||||
strbuf[j] = '\0';
|
|
||||||
now->fwid_optional.data.high = strtoul(strbuf, NULL, 16);
|
|
||||||
}
|
|
||||||
arg = arg + strlen(arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'S':
|
|
||||||
case 's':
|
|
||||||
/*
|
|
||||||
* This is a special one, the -s option is followed (immediately)
|
|
||||||
* by a 8 character string.
|
|
||||||
*/
|
|
||||||
_SEEN(tolower(option)) = TRUE;
|
|
||||||
strncpy(now->fwid_optional.ch, arg, 8);
|
|
||||||
arg = arg + strlen(arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'F':
|
|
||||||
case 'f':
|
|
||||||
/*
|
|
||||||
* This is a special one, the -f option is followed (immediately)
|
|
||||||
* by a filename from which the first 8 bytes will be read and
|
|
||||||
* placed into the optional firmware ID field of the ROM header.
|
|
||||||
*/
|
|
||||||
_SEEN(tolower(option)) = TRUE;
|
|
||||||
{
|
|
||||||
FILE *inf;
|
|
||||||
int i, j;
|
|
||||||
int ch;
|
|
||||||
int quote;
|
|
||||||
char strbuf[16+1];
|
|
||||||
|
|
||||||
inf = fopen(arg, "rb");
|
|
||||||
if (inf == NULL) {
|
|
||||||
fprintf(stderr, "ERROR: failed to open input file %s\n",
|
|
||||||
arg);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
if (fscanf(inf, "%16s", strbuf) && isxdigit(strbuf[0])) {
|
|
||||||
i = strlen(strbuf);
|
|
||||||
|
|
||||||
j = ((i-8)>0)?(i-8):0;
|
|
||||||
now->fwid_optional.data.low = strtoul(&strbuf[j], NULL, 16);
|
|
||||||
strbuf[j] = '\0';
|
|
||||||
now->fwid_optional.data.high = strtoul(strbuf, NULL, 16);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rewind(inf);
|
|
||||||
/* Ignore leading white space */
|
|
||||||
while((ch = getc(inf)) != EOF) {
|
|
||||||
if (isspace(ch)) continue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
quote = FALSE;
|
|
||||||
j=0;
|
|
||||||
/* Open quote if necessary */
|
|
||||||
/* Otherwise store the character. */
|
|
||||||
if (ch == '"') quote = TRUE;
|
|
||||||
else
|
|
||||||
now->fwid_optional.ch[j++] = ch;
|
|
||||||
|
|
||||||
/* Now store up to 7 more characters */
|
|
||||||
while((ch = getc(inf)) != EOF) {
|
|
||||||
now->fwid_optional.ch[j++] = ch;
|
|
||||||
if (j > 8) break;
|
|
||||||
if (quote && (ch == '"')) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Pad zero to 8 chacters if necessary */
|
|
||||||
for (j; j<8; ++j)
|
|
||||||
now->fwid_optional.ch[j] = '\0';
|
|
||||||
}
|
|
||||||
fclose(inf);
|
|
||||||
}
|
|
||||||
arg = arg + strlen(arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* And now print usage and exit if we see an unrecognized switch.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
usage();
|
|
||||||
exit(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fileinfo_t *new;
|
|
||||||
/*
|
|
||||||
* For each new filename supplied, create another file description
|
|
||||||
* block and put it into the file list. The last file is the output
|
|
||||||
* file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
now->file = arg;
|
|
||||||
new = allocate_fileinfo();
|
|
||||||
new->next = NULL;
|
|
||||||
now->next = new;
|
|
||||||
last = now;
|
|
||||||
now = new;
|
|
||||||
now->fwid_ptr = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* As a result of the algorithm that I've used for parsing the
|
|
||||||
* filenames and arguments into file information blocks. "last"
|
|
||||||
* points at an entry that has a pointer to an invalid (empty)
|
|
||||||
* fileinfo block. Decrement the file count also.
|
|
||||||
*/
|
|
||||||
|
|
||||||
last->next = NULL;
|
|
||||||
fcount--;
|
|
||||||
/*
|
|
||||||
* If the world wants to know, then tell it.
|
|
||||||
*/
|
|
||||||
if _OPTION('v') {
|
|
||||||
fprintf(stderr, "makerom [V2.0]\n");
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Check that at least two files have been specified.
|
|
||||||
*/
|
|
||||||
if (fcount < 2) {
|
|
||||||
fprintf(stderr, "ERROR: insufficient filenames supplied\n");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* find the output file and open it.
|
|
||||||
*/
|
|
||||||
output = files;
|
|
||||||
while (output->next != NULL) {
|
|
||||||
if (output->outputfile)
|
|
||||||
break;
|
|
||||||
output = output->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(output->outputfile)) {
|
|
||||||
fprintf(stderr, "ERROR: no output file specified\n");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
out = fopen(output->file, "wb");
|
|
||||||
if (out == NULL) {
|
|
||||||
fprintf(stderr, "ERROR: failed to open output file %s\n",
|
|
||||||
output->file);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Now, for every file, open it, add a header and output the result
|
|
||||||
* to the output file.
|
|
||||||
*/
|
|
||||||
if _OPTION('v')
|
|
||||||
fprintf(stderr, "...Output file is %s\n\n", last->file);
|
|
||||||
now = files;
|
|
||||||
while (now->next != NULL) {
|
|
||||||
if (!(now->outputfile))
|
|
||||||
process_file(now, out);
|
|
||||||
now = now->next;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* close the output file and return.
|
|
||||||
*/
|
|
||||||
fclose(out);
|
|
||||||
return 0;
|
|
||||||
} /* end of main() */
|
|
||||||
|
|
||||||
void process_file(fileinfo_t *ifile, FILE *out)
|
|
||||||
{
|
|
||||||
FILE *in;
|
|
||||||
char *ptr;
|
|
||||||
int32 i;
|
|
||||||
int c;
|
|
||||||
/*
|
|
||||||
* Open the input file.
|
|
||||||
* Get its size.
|
|
||||||
* Output its header.
|
|
||||||
* Output the input file's contents.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if _OPTION('v')
|
|
||||||
fprintf(stderr, "...processing input file %s\n", ifile->file);
|
|
||||||
|
|
||||||
in = fopen(ifile->file, "rb");
|
|
||||||
if (in == NULL) {
|
|
||||||
fprintf(stderr, "ERROR: failed to open input file %s\n",
|
|
||||||
ifile->file);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Load file to get it's size */
|
|
||||||
ifile->size = fsize(in);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Start to build the header.
|
|
||||||
*/
|
|
||||||
head.romh.V0.signature = ROM_H_SIGNATURE; /* pattern for data path */
|
|
||||||
head.romh.V0.csignature = (ui) ~ROM_H_SIGNATURE; /* comp pattern for data path */
|
|
||||||
head.romh.V0.decomp = ifile->compress; /* decompression algorithm */
|
|
||||||
head.romh.V0.hsize = /* header size */
|
|
||||||
(ui) (((unsigned long) &head.romh.hchecksum
|
|
||||||
- (unsigned long) &head) + sizeof(head.romh.hchecksum));
|
|
||||||
|
|
||||||
head.romh.V0.destination.high = ifile->load.high;
|
|
||||||
head.romh.V0.destination.low = ifile->load.low;
|
|
||||||
|
|
||||||
head.romh.V1.hversion = (char) ROM_H_REVISION;
|
|
||||||
head.romh.V0.checksum = 0; /* Initialize ROM image checksum */
|
|
||||||
head.romh.hchecksum = 0; /* Initialize header checksum */
|
|
||||||
head.romh.V1.rimage_size = 0; /* Initialize ROM image size */
|
|
||||||
|
|
||||||
/* Set FW ID optional field */
|
|
||||||
head.romh.V1.fwoptid.id_S.high = ifile->fwid_optional.data.high;
|
|
||||||
head.romh.V1.fwoptid.id_S.low = ifile->fwid_optional.data.low;
|
|
||||||
|
|
||||||
head.romh.V1.fw_id =
|
|
||||||
(char) ((ifile->fwid_ptr != NULL) ? ifile->fwid_ptr->firmware_id : ifile->fwid_alt);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make a pass on the input file to compute the ROM image checksum.
|
|
||||||
*/
|
|
||||||
output_enable = FALSE; /* <-FALSE, Compute checksum only */
|
|
||||||
if (ifile->compress) { /* Do we compress this file? */
|
|
||||||
head.romh.V1.rimage_size = compress(in, out);
|
|
||||||
head.romh.V0.size = ifile->size; /* Uncompressed size */
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (i = 0; i < ifile->size; ++i) {
|
|
||||||
if ((c = getc(in)) == EOF)
|
|
||||||
abort();
|
|
||||||
COMPUTE_CHECKSUM(c,head.romh.V0.checksum);
|
|
||||||
++head.romh.V1.rimage_size; /* Write out the ROM image size */
|
|
||||||
}
|
|
||||||
ifile->padding = 0;
|
|
||||||
while(((ifile->size+ifile->padding)%4) != 0) {
|
|
||||||
++ifile->padding;
|
|
||||||
COMPUTE_CHECKSUM('\0',head.romh.V0.checksum);
|
|
||||||
++head.romh.V1.rimage_size; /* Write out the ROM image size */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ifile->padding)
|
|
||||||
printf(" Image padded by %d bytes\n", ifile->padding);
|
|
||||||
|
|
||||||
head.romh.V0.size = head.romh.V1.rimage_size; /* Same size, No compression */
|
|
||||||
}
|
|
||||||
|
|
||||||
rewind(in); /* Back to the start of the input file. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the header checksum.
|
|
||||||
*/
|
|
||||||
head.romh.hchecksum = compute_romh_chksum(&head);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now write out the header.
|
|
||||||
*/
|
|
||||||
ptr = (char *) &head;
|
|
||||||
for (i = 0; i < (int) head.romh.V0.hsize; i++)
|
|
||||||
fputc(*ptr++, out);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* print out header summary.
|
|
||||||
*/
|
|
||||||
if _OPTION('v') dumpHeader(&head);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Second pass. The checksums have been computed and the header
|
|
||||||
* has already been written out so produce the output file this time.
|
|
||||||
*/
|
|
||||||
output_enable = TRUE; /* <-TRUE, Output file this time */
|
|
||||||
if (ifile->compress) /* Do we compress this file? */
|
|
||||||
compress(in, out);
|
|
||||||
else {
|
|
||||||
/*
|
|
||||||
* Now read in the input file again and output it.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < ifile->size; ++i) {
|
|
||||||
if ((c = getc(in)) == EOF)
|
|
||||||
abort();
|
|
||||||
fputc(c, out);
|
|
||||||
}
|
|
||||||
/* Pad to longword align the end of the file */
|
|
||||||
for (i=0; i<ifile->padding; ++i)
|
|
||||||
fputc('\0', out);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finally, close the input file.
|
|
||||||
*/
|
|
||||||
fclose(in);
|
|
||||||
}
|
|
||||||
void usage()
|
|
||||||
{
|
|
||||||
printf("\nmakerom [options] [<input-file-options>]<input-file>...-o <output-file>\n\n");
|
|
||||||
printf("Builds a rom image by adding headers to the input files.\n");
|
|
||||||
printf("The input files and headers and concatenated and written\n");
|
|
||||||
printf("to the output file. Optionally, those input files may also be\n");
|
|
||||||
printf("compressed\n\n");
|
|
||||||
printf("Where each input file is preceded by options:\n");
|
|
||||||
printf("\t-l,L<address> = load address in memory of the image\n");
|
|
||||||
printf("\t-c,C = compress this file (the SROM code decompresses\n");
|
|
||||||
printf("\t\tthe image). The default is no compression\n");
|
|
||||||
printf("\t-x,X<hex value> = Sets optional firmware ID field.\n");
|
|
||||||
printf("\t-s,S<8 char string> = Sets optional firmware ID field.\n");
|
|
||||||
printf("\t-f,F<file> = Sets optional firmware ID field.\n");
|
|
||||||
printf("\t\tWhere the file contains either a hex value or\n");
|
|
||||||
printf("\t\ta \"quoted\" ASCII string.\n\n");
|
|
||||||
printf("\t-i,I<fw_id> = Firmware ID string or number.\n");
|
|
||||||
printf("\t\tThe following pre-defined values can also be used...\n");
|
|
||||||
|
|
||||||
fwid_dump("\t\t ");
|
|
||||||
|
|
||||||
printf("\nOptional flags are:\n");
|
|
||||||
printf("\t-v,V = verbose mode\n");
|
|
||||||
printf("\t-h,H = print this help text\n");
|
|
||||||
printf("\nExample:\n");
|
|
||||||
printf("\tmakerom -v -l200000 eb66_rom.img -o eb66_rom.rom\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int32 fsize(FILE *fp)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
int32 size = 0;
|
|
||||||
|
|
||||||
fseek(fp, 0, 0);
|
|
||||||
while ((c = getc(fp)) != EOF)
|
|
||||||
size++;
|
|
||||||
fseek(fp, 0, 0);
|
|
||||||
return size;
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue