From 5e84a0851c91fe7bc2cb068384d34ab5f292c013 Mon Sep 17 00:00:00 2001 From: jens Date: Thu, 30 Jun 2022 17:01:40 +0200 Subject: [PATCH] - mips tools: rempoved binary, added sources --- tools/mips/Makefile | 26 ++ tools/mips/flashgen | Bin 17544 -> 0 bytes tools/mips/flashgen_tlb | Bin 17544 -> 0 bytes tools/mips/packhex | Bin 18816 -> 0 bytes tools/mips/ramgen | Bin 25728 -> 0 bytes tools/mips/romgen | Bin 25928 -> 0 bytes tools/mips/src/flashgen.c | 187 +++++++++++++ tools/mips/src/packhex.c | 568 ++++++++++++++++++++++++++++++++++++++ tools/mips/src/ramgen.c | 387 ++++++++++++++++++++++++++ tools/mips/src/romgen.c | 430 +++++++++++++++++++++++++++++ 10 files changed, 1598 insertions(+) create mode 100644 tools/mips/Makefile delete mode 100755 tools/mips/flashgen delete mode 100755 tools/mips/flashgen_tlb delete mode 100755 tools/mips/packhex delete mode 100755 tools/mips/ramgen delete mode 100755 tools/mips/romgen create mode 100644 tools/mips/src/flashgen.c create mode 100644 tools/mips/src/packhex.c create mode 100644 tools/mips/src/ramgen.c create mode 100644 tools/mips/src/romgen.c diff --git a/tools/mips/Makefile b/tools/mips/Makefile new file mode 100644 index 0000000..c2dba55 --- /dev/null +++ b/tools/mips/Makefile @@ -0,0 +1,26 @@ +CFLAGS=-O2 +CC=gcc +PREFIX=/usr/local +all: romgen ramgen flashgen flashgen_tlb packhex + +romgen: ./src/romgen.c + $(CC) $(CFLAGS) ./src/romgen.c -lm -o ./romgen + +ramgen: ./src/ramgen.c + $(CC) $(CFLAGS) ./src/ramgen.c -lm -o ./ramgen + +flashgen: ./src/flashgen.c + $(CC) $(CFLAGS) ./src/flashgen.c -lm -o ./flashgen + +flashgen_tlb: ./src/flashgen.c + $(CC) $(CFLAGS) -DSDRAM_BASE=0x80000000 -DFLASH_BASE_MEM=0x88000000 ./src/flashgen.c -lm -o ./flashgen_tlb + +packhex: ./src/packhex.c + $(CC) $(CFLAGS) ./src/packhex.c -lm -o ./packhex + +install: + cp romgen $(PREFIX)/bin + cp ramgen $(PREFIX)/bin + cp flashgen $(PREFIX)/bin +clean: + rm -rf romgen* ramgen* flashgen* diff --git a/tools/mips/flashgen b/tools/mips/flashgen deleted file mode 100755 index 7eeb8d3545c2ffde8a8a08627f7b2956b95937ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17544 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 diff --git a/tools/mips/flashgen_tlb b/tools/mips/flashgen_tlb deleted file mode 100755 index 6a2ec5e10d2e0b7298f9fd0b9241f3ea840b124b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17544 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 diff --git a/tools/mips/packhex b/tools/mips/packhex deleted file mode 100755 index 23148f24e8efc700e02557a01489406b0be2617d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18816 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 diff --git a/tools/mips/ramgen b/tools/mips/ramgen deleted file mode 100755 index 76f517fcc8acb9ed0c3de9ce85dba04b975ce613..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25728 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 diff --git a/tools/mips/romgen b/tools/mips/romgen deleted file mode 100755 index 16bef3c0a59677da67c98163cb2f240e9bcf5eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25928 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 diff --git a/tools/mips/src/flashgen.c b/tools/mips/src/flashgen.c new file mode 100644 index 0000000..66c031b --- /dev/null +++ b/tools/mips/src/flashgen.c @@ -0,0 +1,187 @@ +#include +#include +#include +#include +#include + +#ifndef SDRAM_BASE +#define SDRAM_BASE 0x40000000 +#endif +#ifndef FLASH_BASE_MEM +#define FLASH_BASE_MEM 0x00000000 +#endif + +#define MAGIC 0x4A464931 // "JFI1" in big-endian; + +uint8_t _g_bytes[4] = {0x12, 0x34, 0x56, 0x78}; +uint8_t _g_bytes2[4] = {0}; + +int IsEndianBig(void) +{ + int i, result; + + uint8_t *pBuf8; + uint16_t *pBuf16; + uint32_t *pBuf32; + uint16_t halve; + uint32_t word; + + + halve = 0x1234; + word = 0x12345678; + + result = -1; + + for (i=0; i < 4; i++) + _g_bytes2[i] = _g_bytes[i]; + + pBuf8 = (uint8_t*)&word; + if (((*pBuf8+0) == 0x12) && (*(pBuf8+1) == 0x34) && (*(pBuf8+2) == 0x56) && (*(pBuf8+3) == 0x78)) + { + pBuf8 = (uint8_t*)&halve; + if (((*pBuf8+0) == 0x12) && (*(pBuf8+1) == 0x34)) + { + result = 1; + } + } + + pBuf8 = (uint8_t*)&word; + if (((*pBuf8+0) == 0x78) && (*(pBuf8+1) == 0x56) && (*(pBuf8+2) == 0x34) && (*(pBuf8+3) == 0x12)) + { + pBuf8 = (uint8_t*)&halve; + if (((*pBuf8+0) == 0x34) && (*(pBuf8+1) == 0x12)) + { + result = 0; + } + } + return result; +} + +uint32_t conv_endian32(uint32_t src) +{ + uint32_t dst; + + dst = (0xFF000000 & (src << 24)) + | (0x00FF0000 & (src << 8)) + | (0x0000FF00 & (src >> 8)) + | (0x000000FF & (src >> 24)); + + return dst; +}; + +// -------------------------------------------------------------- +typedef struct _sflash_img_hdr_t +{ + uint32_t magic; + uint32_t target_addr; + uint32_t img_offset; + uint32_t img_size; + uint32_t hdr_next; + uint8_t img_name[128]; + uint8_t res[108]; + +} flash_img_hdr_t; + +// -------------------------------------------------------------- +void basename(char *pSrc, char *pDst) +{ + int i, size; + + size = strlen(pSrc); + + while(pSrc[size] != '.') + size--; + + for (i=0; i < size; i++) + pDst[i] = pSrc[i]; + + pDst[i] = 0; + +} + +// -------------------------------------------------------------- +int main(int argc, char *argv[]) +{ + char *pFilenameIn; + char name_flash[1024]; + char name_prj[1024]; + char *pBuf; + uint32_t *pBuf32; + flash_img_hdr_t img_hdr = {0}; + + FILE *pFile; + int filesize; + long start, end; + int i; + + if (argc < 2) + { + fprintf(stderr, "Usage: flashgen [-{EL|EB}]\n"); + return 1; + } + + pFilenameIn = argv[1]; + pFile = fopen(pFilenameIn, "rb"); + if (!pFile) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + basename(pFilenameIn, name_prj); + sprintf(name_flash, "%s.flash.bin", name_prj); + + // determine filesize + fseek(pFile, 0, SEEK_SET); + start = ftell(pFile); + fseek(pFile, 0, SEEK_END); + end = ftell(pFile); + fseek(pFile, 0, SEEK_SET); + filesize = (end-start); + + pBuf = (char*)malloc(filesize); + filesize = fread(pBuf, 1, filesize, pFile); + + fclose(pFile); + + pFile = fopen(name_flash, "wb"); + if (!pFile) + { + fprintf(stderr, "Error opening file %s\n", name_flash); + return 1; + } + + img_hdr.magic = MAGIC; + + img_hdr.target_addr = SDRAM_BASE; + img_hdr.img_size = filesize; + img_hdr.img_offset = FLASH_BASE_MEM + sizeof(flash_img_hdr_t); + img_hdr.hdr_next = FLASH_BASE_MEM; + + if (argc == 3) + { + if ((argv[2][0] == '-') && (toupper(argv[2][1]) == 'E') && (toupper(argv[2][2]) == 'B')) + { + if (1 == IsEndianBig()) + { + img_hdr.magic = conv_endian32(MAGIC); + pBuf32 = (uint32_t*)pBuf; + for (i=0; i < filesize/4; i ++) + pBuf32[i] = pBuf32[i]; // don't convert data + } + else + { + pBuf32 = (uint32_t*)pBuf; + for (i=0; i < filesize/4; i ++) + pBuf32[i] = conv_endian32(pBuf32[i]); // convert data + } + } + } + fwrite(&img_hdr, sizeof(flash_img_hdr_t), 1, pFile); + fwrite(pBuf, 1, filesize, pFile); + + fclose(pFile); + + return 0; +} + diff --git a/tools/mips/src/packhex.c b/tools/mips/src/packhex.c new file mode 100644 index 0000000..c00093b --- /dev/null +++ b/tools/mips/src/packhex.c @@ -0,0 +1,568 @@ + +/***** P A C K H E X . C ************************************************ + * + * Packhex is a hex-file compaction utility. It attempts to concatenate + * hex records to produce more size-efficient packaging. + * + * Limitations: Input files must be correctly formatted. This utility + * is not robust enough to detect hex-record formatting + * errors. + * + * Published: May 1993 Embedded Systems Programming magazine + * "Creating Faster Hex Files" + * + * URL: ESP magazine: http://www.embedded.com + * Source Code: ftp://ftp.mfi.com/pub/espmag/1993/pakhex.zip + * + * Author: Mark Gringrich + * + * Compiler: Microsoft C 6.0 + * cl /F 1000 packhex.c + * + * + * $Id: packhex.c,v 1.9 2004/04/20 07:07:08 ralf Exp $ + * + **************************************************************************/ + + +/* #define SMALLER_RECORDS */ +#ifdef SMALLER_RECORDS +#define MAX_LEN_S1_RECS 128 +#define MAX_LEN_S2_RECS 128 +#define MAX_LEN_S3_RECS 128 +#else +#define MAX_LEN_S1_RECS 252 +#define MAX_LEN_S2_RECS 251 +#define MAX_LEN_S3_RECS 250 +#endif + + +/*--------------------------------- includes ---------------------------------*/ + +#include +#include +#include + +#if 0 +#include "config.h" + +#ifndef VMS +#ifndef HAVE_STRERROR +extern int sys_nerr; +extern char *sys_errlist[]; + +#define strerror( _err ) \ + ((_err) < sys_nerr) ? sys_errlist [(_err)] : "unknown error" + +#else /* HAVE_STRERROR */ +char *strerror (); +#endif +#else /* VMS */ +char *strerror (int,...); +#endif +#endif + +#if defined(__unix__) && !defined(EXIT_FAILURE) +#define EXIT_FAILURE -1 +#define EXIT_SUCCESS 0 +#endif + +/*--------------------------------- defines ----------------------------------*/ + +#define YES 1 +#define MAX_LINE_SIZE 600 +#define EOS '\0' + + +/*---------------------------------- macros ----------------------------------*/ + +/* Convert ASCII hexadecimal digit to value. */ + +#define HEX_DIGIT( C ) ( ( ( ( C ) > '9' ) ? ( C ) + 25 : ( C ) ) & 0xF ) + + +/*--------------------------------- typedefs ---------------------------------*/ + +typedef unsigned char Boolean; +typedef unsigned char Uchar; +typedef unsigned int Uint; +typedef unsigned long Ulong; + +typedef struct /* Functions and constant returning Hex-record vital stats. */ +{ + Boolean ( *is_data_record )( char * ); + Ulong ( *get_address )( char * ); + Uint ( *get_data_count )( char * ); + const Uint max_data_count; + char *( *get_data_start )( char * ); + void ( *put_data_record )( Uint, Ulong, char * ); +} Rec_vitals; + + +/*--------------------------- function prototypes ----------------------------*/ + +Rec_vitals * identify_first_data_record( char *, int ); +Ulong get_ndigit_hex( char *, int ); + + +/*----------------------------- Intel Hex format -----------------------------*/ + +/* + * Intel Hex data-record layout + * + * :aabbbbccd...dee + * + * : - header character + * aa - record data byte count, a 2-digit hex value + * bbbb - record address, a 4-digit hex value + * cc - record type, a 2-digit hex value: + * "00" is a data record + * "01" is an end-of-data record + * "02" is an extended-address record + * "03" is a start record + * d...d - data (always an even number of chars) + * ee - record checksum, a 2-digit hex value + * checksum = 2's complement + * [ (sum of bytes: aabbbbccd...d) modulo 256 ] + */ + + +Boolean is_intel_data_rec( char * rec_str ) +{ + return( ( rec_str[ 0 ] == ':' ) && ( rec_str[ 8 ] == '0' ) ); +} + +Uint get_intel_rec_data_count( char * rec_str ) +{ + return( ( Uint ) get_ndigit_hex( rec_str + 1, 2 ) ); +} + +Ulong get_intel_rec_address( char * rec_str ) +{ + return( get_ndigit_hex( rec_str + 3, 4 ) ); +} + +char * get_intel_rec_data_start( char * rec_str ) +{ + return( rec_str + 9 ); +} + +void put_intel_data_rec( Uint count, Ulong address, char * data_str ) +{ + char *ptr; + Uint sum = count + ( address >> 8 & 0xff ) + ( address & 0xff ); + + for ( ptr = data_str ; *ptr != EOS ; ptr += 2 ) + sum += ( Uint ) get_ndigit_hex( ptr, 2 ); + + printf( + ":%02X%04lX00%s%02X\n", count, address, data_str, (~sum + 1) & 0xff + ); +} + + +Rec_vitals intel_hex = +{ + is_intel_data_rec, + get_intel_rec_address, + get_intel_rec_data_count, + 255, /* Maximum data bytes in a record. */ + get_intel_rec_data_start, + put_intel_data_rec +}; + + +/*------------------------- Motorola S1-record format ------------------------*/ + +/* + * Motorola S-record data-record layout + * + * Sabbc...cd...dee + * + * S - header character + * a - record type, a 1-digit value: + * "0" is a header record + * "1" is a 2-byte-address data record + * "2" is a 3-byte-address data record + * "3" is a 4-byte-address data record + * "7" is a 4-byte-address end-of-data record + * "8" is a 3-byte-address end-of-data record + * "9" is a 2-byte-address end-of-data record + * bb - record length in bytes, a 2-digit hex value + * (record length doesn't count the header/type + * chars and checksum byte) + * c...c - record address, a 4-, 6-, or 8-digit value, + * depending on record type + * d...d - data (always an even number of chars) + * ee - record checksum, a 2-digit hex value + * checksum = 1's complement + * [ (sum of all bytes: bbc..cd...d) modulo 256 ] + */ + +#define S1_COUNT_OFFSET 3 + + +Boolean is_moto_s1_data_rec( char * rec_str ) +{ + return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '1' ) ); +} + +Uint get_moto_s1_rec_data_count( char * rec_str ) +{ + return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S1_COUNT_OFFSET ); +} + +Ulong get_moto_s1_rec_address( char * rec_str ) +{ + return( get_ndigit_hex( rec_str + 4, 4 ) ); +} + +char * get_moto_s1_rec_data_start( char * rec_str ) +{ + return( rec_str + 8 ); +} + +void put_moto_s1_data_rec( Uint count, Ulong address, char * data_str ) +{ + char *ptr; + Uint sum = S1_COUNT_OFFSET + count + + ( address >> 8 & 0xff ) + ( address & 0xff ); + + for ( ptr = data_str ; *ptr != EOS ; ptr += 2 ) + sum += ( Uint ) get_ndigit_hex( ptr, 2 ); + + printf( + "S1%02X%04lX%s%02X\n", + count + S1_COUNT_OFFSET, address, data_str, ~sum & 0xff + ); +} + + +Rec_vitals motorola_s1_rec = +{ + is_moto_s1_data_rec, + get_moto_s1_rec_address, + get_moto_s1_rec_data_count, + MAX_LEN_S1_RECS, /* Maximum data bytes in a record. */ + get_moto_s1_rec_data_start, + put_moto_s1_data_rec +}; + + +/*------------------------- Motorola S2-record format ------------------------*/ + +#define S2_COUNT_OFFSET 4 + +Boolean is_moto_s2_data_rec( char * rec_str ) +{ + return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '2' ) ); +} + +Uint get_moto_s2_rec_data_count( char * rec_str ) +{ + return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S2_COUNT_OFFSET ); +} + +Ulong get_moto_s2_rec_address( char * rec_str ) +{ + return( get_ndigit_hex( rec_str + 4, 6 ) ); +} + +char * get_moto_s2_rec_data_start( char * rec_str ) +{ + return( rec_str + 10 ); +} + +void put_moto_s2_data_rec( Uint count, Ulong address, char * data_str ) +{ + char *ptr; + Uint sum = S2_COUNT_OFFSET + count + ( address >> 16 & 0xff ) + + ( address >> 8 & 0xff ) + + ( address & 0xff ); + + for ( ptr = data_str ; *ptr != EOS ; ptr += 2 ) + sum += ( Uint ) get_ndigit_hex( ptr, 2 ); + + printf( + "S2%02X%06lX%s%02X\n", + count + S2_COUNT_OFFSET, address, data_str, ~sum & 0xff + ); +} + + +Rec_vitals motorola_s2_rec = +{ + is_moto_s2_data_rec, + get_moto_s2_rec_address, + get_moto_s2_rec_data_count, + MAX_LEN_S2_RECS, /* Maximum data bytes in a record. */ + get_moto_s2_rec_data_start, + put_moto_s2_data_rec +}; + + +/*------------------------- Motorola S3-record format ------------------------*/ + +#define S3_COUNT_OFFSET 5 + +Boolean is_moto_s3_data_rec( char * rec_str ) +{ + return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '3' ) ); +} + +Uint get_moto_s3_rec_data_count( char * rec_str ) +{ + return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S3_COUNT_OFFSET ); +} + +Ulong get_moto_s3_rec_address( char * rec_str ) +{ + return( get_ndigit_hex( rec_str + 4, 8 ) ); +} + +char * get_moto_s3_rec_data_start( char * rec_str ) +{ + return( rec_str + 12 ); +} + +void put_moto_s3_data_rec( Uint count, Ulong address, char * data_str ) +{ + char *ptr; + Uint sum = S3_COUNT_OFFSET + count + ( address >> 24 & 0xff ) + + ( address >> 16 & 0xff ) + + ( address >> 8 & 0xff ) + + ( address & 0xff ); + + for ( ptr = data_str ; *ptr != EOS ; ptr += 2 ) + sum += ( Uint ) get_ndigit_hex( ptr, 2 ); + + printf( + "S3%02X%08lX%s%02X\n", + count + S3_COUNT_OFFSET, address, data_str, ~sum & 0xff + ); +} + + +Rec_vitals motorola_s3_rec = +{ + is_moto_s3_data_rec, + get_moto_s3_rec_address, + get_moto_s3_rec_data_count, + MAX_LEN_S3_RECS, /* Maximum data bytes in a record. */ + get_moto_s3_rec_data_start, + put_moto_s3_data_rec +}; + + +/*-------------------- Put your favorite hex format here ---------------------*/ + +/* + * * * * The following is a template for an additional hex format: * * * + * + * + * Boolean is_X_data_rec( char * rec_str ) {} + * + * Uint get_X_rec_data_count( char * rec_str ) {} + * + * Ulong get_X_rec_address( char * rec_str ) {} + * + * char * get_X_rec_data_start( char * rec_str ) {} + * + * void put_X_data_rec( Uint count, Ulong address, char * data_str ) {} + * + * Rec_vitals X_rec = + * { + * is_X_data_rec, + * get_X_rec_address, + * get_X_rec_data_count, + * MAXIMUM DATA BYTES IN A RECORD, + * get_X_rec_data_start, + * put_X_data_rec + * }; + * + */ + +/*----------------------------------------------------------------------------*/ + + +/* + * Put address of additional Rec_vitals structures + * in this array, before the NULL entry. + */ + +Rec_vitals *formats[] = +{ + &intel_hex, + &motorola_s1_rec, + &motorola_s2_rec, + &motorola_s3_rec, + ( Rec_vitals * ) NULL +}; + + +/**** main ***************************************************************** +* +* +* Expects: Nothing (no command-line parameters). +* +* Returns: Exit status (EXIT_SUCCESS or EXIT_FAILURE). +* +* Reads hex records on the standard input and attempts to +* splice adjacent data fields together. Results appear on +* the standard output. +* +*******************************************************************************/ + +int main( + int argc, + char **argv +) +{ + + char inbuff[ MAX_LINE_SIZE ], outbuff[ MAX_LINE_SIZE ]; + char *in_dptr, *out_dptr; + int d_total, d_count, d_excess, n; + int length; + Ulong in_rec_addr, out_rec_addr = 0; + Rec_vitals *rptr; + + + /* Sift through file until first hex record is identified. */ + + rptr = identify_first_data_record( inbuff, MAX_LINE_SIZE ); + if ( rptr == NULL ) + { + fputs( "No hex records found.\n", stderr ); + exit( EXIT_FAILURE ); + } + + + /* Attempt data-record splicing until end-of-file is reached. */ + d_total = 0; + for (;;) { + if ( rptr->is_data_record( inbuff ) == YES ) + { /* Input record is a data record. */ + d_count = rptr->get_data_count( inbuff ); + in_rec_addr = rptr->get_address( inbuff ); + in_dptr = rptr->get_data_start( inbuff ); + + if ( d_total == 0 || in_rec_addr != out_rec_addr + d_total ) + { /* Begin a new output record. */ + if ( d_total != 0 ) + rptr->put_data_record( d_total, out_rec_addr, outbuff ); + out_dptr = outbuff; + n = d_total = d_count; + out_rec_addr = in_rec_addr; + } + else if + ( ( d_excess = d_total + d_count - rptr->max_data_count ) > 0 ) + { /* Output a maximum-length record, then start a new record. */ + strncat( outbuff, in_dptr, 2 * ( d_count - d_excess ) ); + rptr->put_data_record( + rptr->max_data_count, out_rec_addr, outbuff + ); + in_dptr += 2 * ( d_count - d_excess ); + out_dptr = outbuff; + n = d_total = d_excess; + out_rec_addr += rptr->max_data_count; + } + else + { /* Append input record's data field with accumulated data. */ + out_dptr = outbuff + ( 2 * d_total ); + d_total += n = d_count; + } + strncpy( out_dptr, in_dptr, 2 * n ); + out_dptr[ 2 * n ] = EOS; + } + else + { /* Not a data record; + * flush accumulated data then echo non-data record. + */ + if ( d_total != 0 ) + { + rptr->put_data_record( d_total, out_rec_addr, outbuff ); + d_total = 0; + } + puts( inbuff ); + } + + inbuff[ MAX_LINE_SIZE - 1 ] = '\0'; + if ( !fgets( inbuff, MAX_LINE_SIZE, stdin ) ) + break; + if ( inbuff[ MAX_LINE_SIZE - 1 ] ) { + fprintf( stderr, "Input line too long" ); + exit( 1 ); + } + length = strlen(inbuff); + inbuff[length - 1] = '\0'; + + } + + + return ( EXIT_SUCCESS ); + +} + + +/**** identify_first_data_record ******************************************* +* +* Expects: Pointer to hex-record line buffer. +* +* Returns: Pointer to hex-record structure (NULL if no match found). +* +* Reads the standard input, line by line, searching for a valid +* record header character. If a valid header is found, a pointer +* to the hex-record's type structure is returned, otherwise NULL. +* +* The input-stream pointer is left pointing to the first valid hex record. +* +*******************************************************************************/ + +Rec_vitals * identify_first_data_record( char * buff_ptr, int max_length ) +{ + Rec_vitals ** ptr; + int length; + + + + for ( ;; ) { + + buff_ptr[ max_length - 1 ] = '\0'; + if ( !fgets( buff_ptr, max_length, stdin ) ) + break; + if ( buff_ptr[ max_length - 1 ] ) { + fprintf( stderr, "Input line too long" ); + exit( 1 ); + } + length = strlen(buff_ptr); + buff_ptr[length - 1] = '\0'; + + for ( ptr = formats ; *ptr != ( Rec_vitals * ) NULL ; ptr++ ) + if ( ( *ptr )->is_data_record( buff_ptr ) == YES ) + return( *ptr ); /* Successful return. */ + + puts( buff_ptr ); /* Echo non-hex-record line. */ + } + + return( ( Rec_vitals * ) NULL ); /* Unsuccessful return. */ +} + + +/**** get_ndigit_hex ******************************************************* +* +* Expects: Pointer to first ASCII hexadecimal digit, number of digits. +* +* Returns: Value of hexadecimal string as an unsigned long. +* +*******************************************************************************/ + +Ulong get_ndigit_hex( char * cptr, int digits ) +{ + Ulong value; + + for ( value = 0 ; --digits >= 0 ; cptr++ ) + value = ( value * 16L ) + HEX_DIGIT( *cptr ); + + return( value ); +} + diff --git a/tools/mips/src/ramgen.c b/tools/mips/src/ramgen.c new file mode 100644 index 0000000..a1ecb69 --- /dev/null +++ b/tools/mips/src/ramgen.c @@ -0,0 +1,387 @@ +#include +#include +#include +#include + +#define ARCH_NAME "data" +#define ENT_NAME "ram" +#define JTAG_ADDR_WIDTH 16 + +// -------------------------------------------------------------- +void basename(char *pSrc, char *pDst) +{ + int i, size; + + size = strlen(pSrc); + + while(pSrc[size] != '.') + size--; + + for (i=0; i < size; i++) + pDst[i] = pSrc[i]; + + pDst[i] = 0; + +} + +int SaveRAM(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, filesize, romsize; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fprintf(pFileOut, "LIBRARY IEEE;\n"); + fprintf(pFileOut, "USE IEEE.STD_LOGIC_1164.ALL;\n"); + fprintf(pFileOut, "USE IEEE.NUMERIC_STD.ALL;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "ENTITY %s IS\n", ENT_NAME); + fprintf(pFileOut, "\tPort\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\t\tclk\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\tce\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\twe\t\t: in unsigned(%d downto 0);\n", nbits_data/8-1); + fprintf(pFileOut, "\t\taddr\t\t: in unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\t\tdin\t\t: in unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\t\tdout\t\t: out unsigned(%d downto 0)\n", nbits_data-1); + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "END %s;\n", ENT_NAME); + fprintf(pFileOut, "\n"); + + + fprintf(pFileOut, "ARCHITECTURE %s OF %s IS\n", ARCH_NAME, ENT_NAME); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tconstant depth : natural := %d;\n", romsize/4); + fprintf(pFileOut, "\tsubtype word_t is unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\ttype word_array_t is array (0 to %d) of word_t;\n", romsize/4-1); + + fprintf(pFileOut, "\tsignal sram : word_array_t :=\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + word = 0; + for (; i < romsize; i += sizeof(int)) + { + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "begin\n", ARCH_NAME); + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "RAM_RW:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(clk)\n"); + fprintf(pFileOut, "\tvariable index : natural range 0 to depth-1;\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(clk) and ce = '1' then\n"); + fprintf(pFileOut, "\t\t\tindex := to_integer(addr(%d downto 2));\n", nbits_addr+1); + fprintf(pFileOut, "\t\t\tif we(0) = '1' then\n"); + fprintf(pFileOut, "\t\t\t\tsram(index)(7 downto 0)\t\t<= din(7 downto 0);\n"); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\t\tif we(1) = '1' then\n"); + fprintf(pFileOut, "\t\t\t\tsram(index)(15 downto 8)\t<= din(15 downto 8);\n"); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\t\tif we(2) = '1' then\n"); + fprintf(pFileOut, "\t\t\t\tsram(index)(23 downto 16)\t<= din(23 downto 16);\n"); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\t\tif we(3) = '1' then\n"); + fprintf(pFileOut, "\t\t\t\tsram(index)(31 downto 24)\t\t<= din(31 downto 24);\n"); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\t\tdout <= sram(index);\n"); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "end %s;\n", ARCH_NAME); + + return 0; +} + +int SaveRAM_V4LD(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, filesize, romsize; + + char tpl[] = {"--------------------------------------------------------------------------\n-- Virtex-4: JTAG Loader\n--------------------------------------------------------------------------\n\ti00_BUFG : BUFG\n\tport map\n\t(\n\t\tO => bs_clk1,\n I => bs_clk0\n\t);\n\t\n\ti01_BUFG : BUFG\n\tport map\n\t(\n\t\tO => bs_update1,\n I => bs_update0\n\t);\n\n\tBSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 \n\tgeneric map\n\t(\n\t\tJTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4)\n\t)\n\tport map \n\t(\n\t\tCAPTURE => bs_capture, -- CAPTURE output from TAP controller\n\t\tDRCK => bs_clk0, -- Data register output for USER functions\n\t\tRESET => bs_rst, -- Reset output from TAP controller\n\t\tSEL => bs_sel, -- USER active output\n\t\tSHIFT => bs_shift, -- SHIFT output from TAP controller\n\t\tTDI => bs_tdi, -- TDI output from TAP controller\n\t\tUPDATE => bs_update0, -- UPDATE output from TAP controller\n\t\tTDO => bs_tdo -- Data input for USER function\n\t);\n\n\tjtag_ld_addr <= user_regi(user_regi'left downto jtag_ld_dout'length);\n\tjtag_ld_din <= user_regi(jtag_ld_dout'length-1 downto 0);\n\tjtag_ld_clk <= bs_update1;\n\tjtag_ld_we <= bs_sel;\n\t\nsipo:\n\tprocess (bs_rst, bs_clk1, bs_tdi, bs_shift)\n\tbegin\n\t\tif bs_rst = '1' then\n\t\t\tuser_regi <= (others => '0');\n\t\telsif rising_edge(bs_clk1) then\n\t\t\tif bs_shift = '1' then\n\t\t\t\tuser_regi <= bs_tdi & user_regi(user_regi'left downto 1);\n\t\t\tend if;\n\t\tend if;\n\tend process;\t\n\npiso:\n\tprocess (bs_rst, bs_clk1, bs_shift, user_rego)\n\tbegin\n\t\tbs_tdo <= user_rego(0);\n\t\tif bs_rst = '1' then\n\t\t\tuser_rego <= (others => '0');\n\t\telsif rising_edge(bs_clk1) then\n\t\t\tif bs_shift = '1' then\n\t\t\t\tuser_rego <= user_rego(0) & user_rego(user_rego'left downto 1);\n\t\t\telse\n\t\t\t\tuser_rego <= (user_rego'left downto jtag_ld_dout'length => '0') & jtag_ld_dout;\t\n\t\n\t\t\tend if;\n\t\tend if;\n\tend process;\n\n"}; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fprintf(pFileOut, "LIBRARY IEEE;\n"); + fprintf(pFileOut, "USE IEEE.STD_LOGIC_1164.ALL;\n"); + fprintf(pFileOut, "USE IEEE.NUMERIC_STD.ALL;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "library UNISIM;\n"); + fprintf(pFileOut, "use UNISIM.VComponents.all;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "ENTITY %s IS\n", ENT_NAME); + fprintf(pFileOut, "\tPort\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\t\tclk\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\tce\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\taddr\t\t: in unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\t\tdout\t\t: out unsigned(%d downto 0)\n", nbits_data-1); + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "END %s;\n", ENT_NAME); + fprintf(pFileOut, "\n"); + + + fprintf(pFileOut, "ARCHITECTURE %s OF %s IS\n", ARCH_NAME, ENT_NAME); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tsubtype word_t is unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\ttype word_array_t is array (0 to %d) of word_t;\n", romsize/4-1); + + fprintf(pFileOut, "\tsignal jtag_ld_clk\t\t: STD_LOGIC;\n"); + fprintf(pFileOut, "\tsignal jtag_ld_we\t\t: STD_LOGIC;\n"); + fprintf(pFileOut, "\tsignal jtag_ld_addr\t\t: unsigned (%d downto 0);\n", JTAG_ADDR_WIDTH-1); + fprintf(pFileOut, "\tsignal jtag_ld_dout\t\t: unsigned (%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\tsignal jtag_ld_din\t\t: unsigned (%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\tsignal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic;\n"); + fprintf(pFileOut, "\tsignal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic;\n"); + fprintf(pFileOut, "\tsignal user_regi, user_rego : unsigned (%d downto 0);\n", 31 + JTAG_ADDR_WIDTH); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tsignal word_array : word_array_t :=\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + word = 0; + for (; i < romsize; i += sizeof(int)) + { + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "begin\n", ARCH_NAME); + + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "PROM_READ:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(clk)\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(clk) then\n"); + fprintf(pFileOut, "\t\t\tif ce = '1' then\n"); + fprintf(pFileOut, "\t\t\tdout <= word_array(to_integer(addr(%d downto 2)));\n", nbits_addr+1); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "\n"); + fputs(tpl, pFileOut); + + fprintf(pFileOut, "PROM_WRITE:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(jtag_ld_clk, jtag_ld_we)\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(jtag_ld_clk) then\n"); + fprintf(pFileOut, "\t\t\tif jtag_ld_we = '1' then\n"); + fprintf(pFileOut, "\t\t\t\tword_array(to_integer(jtag_ld_addr(%d downto 0))) <= jtag_ld_din;\n", nbits_addr-1); + fprintf(pFileOut, "\t\t\telse\n"); + fprintf(pFileOut, "\t\t\t\tjtag_ld_dout <= word_array(to_integer(jtag_ld_addr(%d downto 0)));\n", nbits_addr-1); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "end %s;\n", ARCH_NAME); + return 0; +} + +int SaveRAM_TCL(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, word_addr, filesize, romsize; + char binstr_addr[33]; + char binstr_data[33]; + + char tpl[] = {"# ---------------------------------------------------------------------\n# For Chipscope 9.1\n# ---------------------------------------------------------------------\n# Source JTAG/TCL frame work\ncd $env(CHIPSCOPE)\\\\bin\\\\nt\nsource csejtag.tcl\n\nnamespace import ::chipscope::*\n\n# Platform USB Cable\nset PLATFORM_USB_CABLE_ARGS [list \"port=USB2\" \"frequency=6000000\"]\n# frequency=\"24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000\"\n\n# Create session\nset handle [::chipscope::csejtag_session create 0]\n\n# Open JTAG and lock\nset open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS]\nset lock_result [::chipscope::csejtag_target lock $handle 1000]\n\nset devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT]\n\n# Get Device ID\nset devtype \"Virtex-4SX\"\nset devid 2\nset irlength [::chipscope::csejtag_tap get_irlength $handle $devid]\nset idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid]\n\nset CSE_OP $CSEJTAG_SHIFT_READWRITE\nset CSE_ES $CSEJTAG_RUN_TEST_IDLE\n\n# Write Program\n"}; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fputs(tpl, pFileOut); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + fprintf(pFileOut, "# Assembled from %s\n", pFilenameIn); + fprintf(pFileOut, "# ---------------------------------------------------------------\n"); + fprintf(pFileOut, "# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA\n"); + fprintf(pFileOut, "# User 2\n"); + fprintf(pFileOut, "set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength \"3C3\"]\n\n"); + + word_addr = 0; + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + fprintf(pFileOut, "::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%4.4X%8.8X\"\n", nbits_data + JTAG_ADDR_WIDTH, word_addr, word); + word_addr++; + } + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "::chipscope::csejtag_target unlock $handle\n"); + fprintf(pFileOut, "::chipscope::csejtag_target close $handle\n"); + fprintf(pFileOut, "::chipscope::csejtag_session destroy $handle\n"); + fprintf(pFileOut, "exit\n"); + + return 0; +} + +int main(int argc, char *argv[]) +{ + char *pFilenameIn; + char name_prj[1024]; + char name_rom_tcl[1024]; + char name_rom[1024]; + char name_rom_v4ld[1024]; + + FILE *pFileIn; + int filesize, romsize, nbits_addr, nbits_data; + long start, end; + int word, i; + + if (argc < 2) + { + fprintf(stderr, "Usage: ramgen \n"); + return 1; + } + + pFilenameIn = argv[1]; + if (argc == 3) + nbits_addr = atoi(argv[2]); + + + basename(pFilenameIn, name_prj); + sprintf(name_rom, "%s.vhd", name_prj); + sprintf(name_rom_v4ld, "%s_ld.vhd", name_prj); + sprintf(name_rom_tcl, "%s.tcl", name_prj); + + SaveRAM(pFilenameIn, name_rom, ARCH_NAME, ENT_NAME, nbits_addr, 32); +// SaveROM_V4LD(pFilenameIn, name_rom_v4ld, ARCH_NAME, ENT_NAME, nbits_addr, 32); + SaveRAM_TCL(pFilenameIn, name_rom_tcl, ARCH_NAME, ENT_NAME, nbits_addr, 32); + + + return 0; +} + diff --git a/tools/mips/src/romgen.c b/tools/mips/src/romgen.c new file mode 100644 index 0000000..b988562 --- /dev/null +++ b/tools/mips/src/romgen.c @@ -0,0 +1,430 @@ +#include +#include +#include +#include + +#define INT8 char +#define INT16 short +#define INT32 long +#define UINT8 unsigned char +#define UINT16 unsigned short +#define UINT32 unsigned long +#define INT int +#define UINT unsigned int +#define FLOAT32 float +#define FLOAT64 double + +#define ARCH_NAME "data" +#define ENT_NAME "rom" +#define JTAG_ADDR_WIDTH 16 + +UINT32 g_endianess_EB; + +// -------------------------------------------------------------- +UINT32 conv_endian32(UINT32 src) +{ + UINT32 dst; + + dst = (0xFF000000 & (src << 24)) + | (0x00FF0000 & (src << 8)) + | (0x0000FF00 & (src >> 8)) + | (0x000000FF & (src >> 24)); + + return dst; +}; + +UINT32 to_big_endian32(UINT32 src) +{ +#ifndef NATIVE_IS_BIG_ENDIAN + return conv_endian32(src); +#else + return src; +#endif +} + +UINT32 from_big_endian32(UINT32 src) +{ +#ifndef NATIVE_IS_BIG_ENDIAN + return conv_endian32(src); +#else + return src; +#endif +} + +void basename(char *pSrc, char *pDst) +{ + int i, size; + + size = strlen(pSrc); + + while(pSrc[size] != '.') + size--; + + for (i=0; i < size; i++) + pDst[i] = pSrc[i]; + + pDst[i] = 0; + +} + +int SaveROM(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, filesize, romsize; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fprintf(pFileOut, "LIBRARY IEEE;\n"); + fprintf(pFileOut, "USE IEEE.STD_LOGIC_1164.ALL;\n"); + fprintf(pFileOut, "USE IEEE.NUMERIC_STD.ALL;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "ENTITY %s IS\n", ENT_NAME); + fprintf(pFileOut, "\tPort\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\t\tclk\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\tce\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\taddr\t\t: in unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\t\tdout\t\t: out unsigned(%d downto 0)\n", nbits_data-1); + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "END %s;\n", ENT_NAME); + fprintf(pFileOut, "\n"); + + + fprintf(pFileOut, "ARCHITECTURE %s OF %s IS\n", ARCH_NAME, ENT_NAME); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tsubtype word_t is unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\ttype word_array_t is array (0 to %d) of word_t;\n", romsize/4-1); + + fprintf(pFileOut, "\tconstant word_array : word_array_t :=\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + if (g_endianess_EB) + fprintf(pFileOut, "\t\tX\"%8.8X\"", to_big_endian32(word)); + else + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + word = 0; + for (; i < romsize; i += sizeof(int)) + { + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "begin\n", ARCH_NAME); + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "PROM_READ:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(clk)\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(clk) then\n"); + fprintf(pFileOut, "\t\t\tif ce = '1' then\n"); + fprintf(pFileOut, "\t\t\t\tdout <= word_array(to_integer(addr(%d downto 2)));\n", nbits_addr+1); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "end %s;\n", ARCH_NAME); + + return 0; +} + +int SaveROM_V4LD(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, filesize, romsize; + + char tpl[] = {"--------------------------------------------------------------------------\n-- Virtex-4: JTAG Loader\n--------------------------------------------------------------------------\n\ti00_BUFG : BUFG\n\tport map\n\t(\n\t\tO => bs_clk1,\n I => bs_clk0\n\t);\n\t\n\ti01_BUFG : BUFG\n\tport map\n\t(\n\t\tO => bs_update1,\n I => bs_update0\n\t);\n\n\tBSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 \n\tgeneric map\n\t(\n\t\tJTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4)\n\t)\n\tport map \n\t(\n\t\tCAPTURE => bs_capture, -- CAPTURE output from TAP controller\n\t\tDRCK => bs_clk0, -- Data register output for USER functions\n\t\tRESET => bs_rst, -- Reset output from TAP controller\n\t\tSEL => bs_sel, -- USER active output\n\t\tSHIFT => bs_shift, -- SHIFT output from TAP controller\n\t\tTDI => bs_tdi, -- TDI output from TAP controller\n\t\tUPDATE => bs_update0, -- UPDATE output from TAP controller\n\t\tTDO => bs_tdo -- Data input for USER function\n\t);\n\n\tjtag_ld_addr <= user_regi(user_regi'left downto jtag_ld_dout'length);\n\tjtag_ld_din <= user_regi(jtag_ld_dout'length-1 downto 0);\n\tjtag_ld_clk <= bs_update1;\n\tjtag_ld_we <= bs_sel;\n\t\nsipo:\n\tprocess (bs_rst, bs_clk1, bs_tdi, bs_shift)\n\tbegin\n\t\tif bs_rst = '1' then\n\t\t\tuser_regi <= (others => '0');\n\t\telsif rising_edge(bs_clk1) then\n\t\t\tif bs_shift = '1' then\n\t\t\t\tuser_regi <= bs_tdi & user_regi(user_regi'left downto 1);\n\t\t\tend if;\n\t\tend if;\n\tend process;\t\n\npiso:\n\tprocess (bs_rst, bs_clk1, bs_shift, user_rego)\n\tbegin\n\t\tbs_tdo <= user_rego(0);\n\t\tif bs_rst = '1' then\n\t\t\tuser_rego <= (others => '0');\n\t\telsif rising_edge(bs_clk1) then\n\t\t\tif bs_shift = '1' then\n\t\t\t\tuser_rego <= user_rego(0) & user_rego(user_rego'left downto 1);\n\t\t\telse\n\t\t\t\tuser_rego <= (user_rego'left downto jtag_ld_dout'length => '0') & jtag_ld_dout;\t\n\t\n\t\t\tend if;\n\t\tend if;\n\tend process;\n\n"}; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fprintf(pFileOut, "LIBRARY IEEE;\n"); + fprintf(pFileOut, "USE IEEE.STD_LOGIC_1164.ALL;\n"); + fprintf(pFileOut, "USE IEEE.NUMERIC_STD.ALL;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "library UNISIM;\n"); + fprintf(pFileOut, "use UNISIM.VComponents.all;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "ENTITY %s IS\n", ENT_NAME); + fprintf(pFileOut, "\tPort\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\t\tclk\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\tce\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\taddr\t\t: in unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\t\tdout\t\t: out unsigned(%d downto 0)\n", nbits_data-1); + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "END %s;\n", ENT_NAME); + fprintf(pFileOut, "\n"); + + + fprintf(pFileOut, "ARCHITECTURE %s OF %s IS\n", ARCH_NAME, ENT_NAME); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tsubtype word_t is unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\ttype word_array_t is array (0 to %d) of word_t;\n", romsize/4-1); + + fprintf(pFileOut, "\tsignal jtag_ld_clk\t\t: STD_LOGIC;\n"); + fprintf(pFileOut, "\tsignal jtag_ld_we\t\t: STD_LOGIC;\n"); + fprintf(pFileOut, "\tsignal jtag_ld_addr\t\t: unsigned (%d downto 0);\n", JTAG_ADDR_WIDTH-1); + fprintf(pFileOut, "\tsignal jtag_ld_dout\t\t: unsigned (%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\tsignal jtag_ld_din\t\t: unsigned (%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\tsignal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic;\n"); + fprintf(pFileOut, "\tsignal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic;\n"); + fprintf(pFileOut, "\tsignal user_regi, user_rego : unsigned (%d downto 0);\n", 31 + JTAG_ADDR_WIDTH); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tsignal word_array : word_array_t :=\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + if (g_endianess_EB) + fprintf(pFileOut, "\t\tX\"%8.8X\"", to_big_endian32(word)); + else + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + word = 0; + for (; i < romsize; i += sizeof(int)) + { + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "begin\n", ARCH_NAME); + + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "PROM_READ:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(clk)\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(clk) and ce = '1' then\n"); + fprintf(pFileOut, "\t\t\tdout <= word_array(to_integer(addr(%d downto 2)));\n", nbits_addr+1); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "\n"); + fputs(tpl, pFileOut); + + fprintf(pFileOut, "PROM_WRITE:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(jtag_ld_clk, jtag_ld_we)\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(jtag_ld_clk) then\n"); + fprintf(pFileOut, "\t\t\tif jtag_ld_we = '1' then\n"); + fprintf(pFileOut, "\t\t\t\tword_array(to_integer(jtag_ld_addr(%d downto 0))) <= jtag_ld_din;\n", nbits_addr-1); + fprintf(pFileOut, "\t\t\telse\n"); + fprintf(pFileOut, "\t\t\t\tjtag_ld_dout <= word_array(to_integer(jtag_ld_addr(%d downto 0)));\n", nbits_addr-1); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "end %s;\n", ARCH_NAME); + return 0; +} + +int SaveROM_TCL(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, word_addr, filesize, romsize; + char binstr_addr[33]; + char binstr_data[33]; + + char tpl[] = + {"# ---------------------------------------------------------------------\n# For Chipscope 10.1\n# ---------------------------------------------------------------------\n# Source JTAG/TCL frame work\nsource $env(CS_PATH)\\\\csejtag.tcl\n\nnamespace import ::chipscope::*\n\n# Platform USB Cable\n# Create session\nset handle [::chipscope::csejtag_session create 0]\n\n# Open JTAG and lock\nset open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 \"port=USB2\" \"frequency=6000000\"]\n# frequency=\"24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000\"\n\nset lock_result [::chipscope::csejtag_target lock $handle 1000]\n\nset devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT]\n\n# Get Device ID\nset devtype \"Virtex-4SX\"\nset devid 2\nset irlength [::chipscope::csejtag_tap get_irlength $handle $devid]\nset idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid]\n\nset CSE_OP $CSEJTAG_SHIFT_READWRITE\nset CSE_ES $CSEJTAG_RUN_TEST_IDLE\n\n# Write Program\n"}; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fputs(tpl, pFileOut); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + fprintf(pFileOut, "# Assembled from %s\n", pFilenameIn); + fprintf(pFileOut, "# ---------------------------------------------------------------\n"); + fprintf(pFileOut, "# Shift the USER1 Instruction (b1111000010) into the Instruction Register of FPGA\n"); + fprintf(pFileOut, "# User 1\n"); + fprintf(pFileOut, "set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength \"3C2\"]\n\n"); + + word_addr = 0; + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + if (g_endianess_EB) + fprintf(pFileOut, "::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%4.4X%8.8X\"\n", nbits_data + JTAG_ADDR_WIDTH, word_addr, to_big_endian32(word)); + else + fprintf(pFileOut, "::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%4.4X%8.8X\"\n", nbits_data + JTAG_ADDR_WIDTH, word_addr, word); + word_addr++; + } + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "::chipscope::csejtag_target unlock $handle\n"); + fprintf(pFileOut, "::chipscope::csejtag_target close $handle\n"); + fprintf(pFileOut, "::chipscope::csejtag_session destroy $handle\n"); + fprintf(pFileOut, "exit\n"); + + return 0; +} + +int main(int argc, char *argv[]) +{ + char *pFilenameIn; + char name_prj[1024]; + char name_rom[1024]; + char name_rom_v4ld[1024]; + char name_rom_tcl[1024]; + + FILE *pFileIn; + int filesize, romsize, nbits_addr, nbits_data; + long start, end; + int word, i; + + if (argc < 2) + { + fprintf(stderr, "Usage: romgen [-{EL|EB}]\n"); + return 1; + } + + pFilenameIn = argv[1]; + nbits_addr = atoi(argv[2]); + + g_endianess_EB = 0; + if (argc == 4) + { + if ((argv[3][0] == '-') && (toupper(argv[3][1]) == 'E') && (toupper(argv[3][2]) == 'B')) + g_endianess_EB = 1; + } + + basename(pFilenameIn, name_prj); + sprintf(name_rom, "%s.vhd", name_prj); + sprintf(name_rom_v4ld, "%s_ld.vhd", name_prj); + sprintf(name_rom_tcl, "%s.tcl", name_prj); + + SaveROM(pFilenameIn, name_rom, ARCH_NAME, ENT_NAME, nbits_addr, 32); + SaveROM_V4LD(pFilenameIn, name_rom_v4ld, ARCH_NAME, ENT_NAME, nbits_addr, 32); + SaveROM_TCL(pFilenameIn, name_rom_tcl, ARCH_NAME, ENT_NAME, nbits_addr, 32); + + + return 0; +} +