diff --git a/lib/CPUs/MIPS/tools/src/romgen.c b/lib/CPUs/MIPS/tools/src/romgen.c index 02df5bc..60c00c3 100644 --- a/lib/CPUs/MIPS/tools/src/romgen.c +++ b/lib/CPUs/MIPS/tools/src/romgen.c @@ -3,11 +3,54 @@ #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; @@ -90,7 +133,11 @@ int SaveROM(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntNa for (i=0; i < filesize; i += sizeof(int)) { fread(&word, 1, sizeof(int), pFileIn); - fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + 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 @@ -208,7 +255,11 @@ int SaveROM_V4LD(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *p for (i=0; i < filesize; i += sizeof(int)) { fread(&word, 1, sizeof(int), pFileIn); - fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + 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 @@ -314,7 +365,10 @@ int SaveROM_TCL(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pE 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); + 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"); @@ -345,13 +399,19 @@ int main(int argc, char *argv[]) if (argc < 2) { - fprintf(stderr, "Usage: romgen \n"); + fprintf(stderr, "Usage: romgen [{EL|EB}]\n"); return 1; } pFilenameIn = argv[1]; - if (argc == 3) - nbits_addr = atoi(argv[2]); + nbits_addr = atoi(argv[2]); + + g_endianess_EB = 0; + if (argc == 4) + { + if ((toupper(argv[3][0]) == 'E') && (toupper(argv[3][1]) == 'B')) + g_endianess_EB = 1; + } basename(pFilenameIn, name_prj);