Committed on the Free edition of March Hare Software CVSNT Server. Upgrade to CVS Suite for more features and support: http://march-hare.com/cvsnt/ git-svn-id: http://moon:8086/svn/vhdl/trunk@285 cc03376c-175c-47c8-b038-4cd826a8556b
154 lines
2.9 KiB
C
154 lines
2.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
|
|
#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 SDRAM_BASE 0x40000000
|
|
#define FLASH_OFFSET 0x00000000
|
|
|
|
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
|
|
}
|
|
|
|
// --------------------------------------------------------------
|
|
typedef struct _sflash_img_hdr_t
|
|
{
|
|
UINT8 magic[4];
|
|
UINT32 target_addr;
|
|
UINT32 img_offset;
|
|
UINT32 img_size;
|
|
UINT32 hdr_next;
|
|
UINT8 img_name[128];
|
|
UINT8 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;
|
|
flash_img_hdr_t img_hdr = {0};
|
|
|
|
FILE *pFile;
|
|
int filesize;
|
|
long start, end;
|
|
int i;
|
|
|
|
if (argc < 2)
|
|
{
|
|
fprintf(stderr, "Usage: flashgen <input file>\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);
|
|
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[0] = 'J';
|
|
img_hdr.magic[1] = 'F';
|
|
img_hdr.magic[2] = 'I';
|
|
img_hdr.magic[3] = '1';
|
|
#ifdef TARGET_IS_BIG_ENDIAN
|
|
img_hdr.target_addr = to_big_endian32(SDRAM_BASE);
|
|
img_hdr.img_size = to_big_endian32(filesize);
|
|
img_hdr.img_offset = to_big_endian32(FLASH_OFFSET + sizeof(flash_img_hdr_t));
|
|
img_hdr.hdr_next = to_big_endian32(FLASH_OFFSET);
|
|
#else
|
|
img_hdr.target_addr = SDRAM_BASE;
|
|
img_hdr.img_size = filesize;
|
|
img_hdr.img_offset = FLASH_OFFSET + sizeof(flash_img_hdr_t);
|
|
img_hdr.hdr_next = FLASH_OFFSET;
|
|
#endif
|
|
fwrite(&img_hdr, sizeof(flash_img_hdr_t), 1, pFile);
|
|
fwrite(pBuf, 1, filesize, pFile);
|
|
|
|
fclose(pFile);
|
|
|
|
return 0;
|
|
}
|
|
|