322 lines
7.9 KiB
C
322 lines
7.9 KiB
C
|
#include <string.h>
|
|||
|
#include <malloc.h>
|
|||
|
#include "imgdecode.h"
|
|||
|
#include "imagefile_new.h"
|
|||
|
|
|||
|
#define HEAD_ID 0 //ͷ<><CDB7><EFBFBD>ܽӿ<DCBD><D3BF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
#define TABLE_ID 1 //<2F><><EFBFBD><EFBFBD><EFBFBD>ܽӿ<DCBD><D3BF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
#define DATA_ID 2 //<2F><><EFBFBD>ݼ<EFBFBD><DDBC>ܽӿ<DCBD><D3BF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
#define IF_CNT 3 //<2F><><EFBFBD>ܽӿڸ<D3BF><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ͷ<EFBFBD><CDB7><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>3<EFBFBD><33>
|
|||
|
#define MAX_KEY_SIZE 32 //<2F><><EFBFBD>볤<EFBFBD><EBB3A4>
|
|||
|
|
|||
|
#pragma pack(push, 1)
|
|||
|
typedef struct tag_IMAGE_HANDLE
|
|||
|
{
|
|||
|
ImageHead_t ImageHead; //imgͷ<67><CDB7>Ϣ
|
|||
|
ImageItem_t *ItemTable; //item<65><6D>Ϣ<EFBFBD><CFA2>
|
|||
|
}IMAGE_HANDLE;
|
|||
|
|
|||
|
#define INVALID_INDEX 0xFFFFFFFF
|
|||
|
|
|||
|
|
|||
|
typedef struct tag_ITEM_HANDLE{
|
|||
|
uint index; //<2F><>ItemTable<6C>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
uint reserved[3];
|
|||
|
// long long pos;
|
|||
|
}ITEM_HANDLE;
|
|||
|
|
|||
|
#define ITEM_PHOENIX_TOOLS "PXTOOLS "
|
|||
|
|
|||
|
FILE *img_file_hd;
|
|||
|
//------------------------------------------------------------------------------------------------------------
|
|||
|
//image<67><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľӿ<C4BD>
|
|||
|
//------------------------------------------------------------------------------------------------------------
|
|||
|
HIMAGE Img_Open (char * ImageFile)
|
|||
|
{
|
|||
|
IMAGE_HANDLE * pImage = NULL;
|
|||
|
uint ItemTableSize; //<2F>̼<EFBFBD><CCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
|
|||
|
|
|||
|
img_file_hd = fopen(ImageFile, "rb");
|
|||
|
if(img_file_hd == NULL)
|
|||
|
{
|
|||
|
printf("sunxi sprite error: unable to open firmware file\n");
|
|||
|
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
pImage = (IMAGE_HANDLE *)malloc(sizeof(IMAGE_HANDLE));
|
|||
|
if (NULL == pImage)
|
|||
|
{
|
|||
|
printf("sunxi sprite error: fail to malloc memory for img head\n");
|
|||
|
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
memset(pImage, 0, sizeof(IMAGE_HANDLE));
|
|||
|
//------------------------------------------------
|
|||
|
//<2F><>imgͷ
|
|||
|
//------------------------------------------------
|
|||
|
//debug("try to read mmc start %d\n", img_file_start);
|
|||
|
if(!fread(&pImage->ImageHead, IMAGE_HEAD_SIZE, 1, img_file_hd))
|
|||
|
{
|
|||
|
printf("sunxi sprite error: read iamge head fail\n");
|
|||
|
|
|||
|
goto _img_open_fail_;
|
|||
|
}
|
|||
|
//------------------------------------------------
|
|||
|
//<2F>Ƚ<EFBFBD>magic
|
|||
|
//------------------------------------------------
|
|||
|
if (memcmp(pImage->ImageHead.magic, IMAGE_MAGIC, 8) != 0)
|
|||
|
{
|
|||
|
printf("sunxi sprite error: iamge magic is bad\n");
|
|||
|
|
|||
|
goto _img_open_fail_;
|
|||
|
}
|
|||
|
//------------------------------------------------
|
|||
|
//Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٿռ<D9BF>
|
|||
|
//------------------------------------------------
|
|||
|
ItemTableSize = pImage->ImageHead.itemcount * sizeof(ImageItem_t);
|
|||
|
pImage->ItemTable = (ImageItem_t*)malloc(ItemTableSize);
|
|||
|
if (NULL == pImage->ItemTable)
|
|||
|
{
|
|||
|
printf("sunxi sprite error: fail to malloc memory for item table\n");
|
|||
|
|
|||
|
goto _img_open_fail_;
|
|||
|
}
|
|||
|
//------------------------------------------------
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//------------------------------------------------
|
|||
|
if(!fread(pImage->ItemTable, ItemTableSize, 1, img_file_hd))
|
|||
|
{
|
|||
|
printf("sunxi sprite error: read iamge item table fail\n");
|
|||
|
|
|||
|
goto _img_open_fail_;
|
|||
|
}
|
|||
|
|
|||
|
return pImage;
|
|||
|
|
|||
|
_img_open_fail_:
|
|||
|
if(pImage->ItemTable)
|
|||
|
{
|
|||
|
free(pImage->ItemTable);
|
|||
|
}
|
|||
|
if(pImage)
|
|||
|
{
|
|||
|
free(pImage);
|
|||
|
}
|
|||
|
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
long long Img_GetSize (HIMAGE hImage)
|
|||
|
{
|
|||
|
long long size;
|
|||
|
|
|||
|
if (NULL == hImage)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : hImage is NULL\n");
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
|
|||
|
size = pImage->ImageHead.lenHi;
|
|||
|
size <<= 32;
|
|||
|
size |= pImage->ImageHead.lenLo;
|
|||
|
|
|||
|
return size;
|
|||
|
}
|
|||
|
HIMAGEITEM Img_OpenItem (HIMAGE hImage, char * MainType, char * subType)
|
|||
|
{
|
|||
|
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
|
|||
|
ITEM_HANDLE * pItem = NULL;
|
|||
|
uint i;
|
|||
|
|
|||
|
if (NULL == pImage || NULL == subType)
|
|||
|
{
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
pItem = (ITEM_HANDLE *) malloc(sizeof(ITEM_HANDLE));
|
|||
|
if (NULL == pItem)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : cannot malloc memory for item\n");
|
|||
|
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
pItem->index = INVALID_INDEX;
|
|||
|
|
|||
|
for (i = 0; i < pImage->ImageHead.itemcount ; i++)
|
|||
|
{
|
|||
|
if(!memcmp(subType, pImage->ItemTable[i].subType, SUBTYPE_LEN))
|
|||
|
{
|
|||
|
pItem->index = i;
|
|||
|
return pItem;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
printf("sunxi sprite error : cannot find item %s %s\n", MainType, subType);
|
|||
|
|
|||
|
free(pItem);
|
|||
|
pItem = NULL;
|
|||
|
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
long long Img_GetItemSize (HIMAGE hImage, HIMAGEITEM hItem)
|
|||
|
{
|
|||
|
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
|
|||
|
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
|
|||
|
long long size;
|
|||
|
|
|||
|
if (NULL == pItem)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : item is NULL\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
size = pImage->ItemTable[pItem->index].filelenHi;
|
|||
|
size <<= 32;
|
|||
|
size |= pImage->ItemTable[pItem->index].filelenLo;
|
|||
|
|
|||
|
return size;
|
|||
|
}
|
|||
|
|
|||
|
uint Img_GetItemStart (HIMAGE hImage, HIMAGEITEM hItem)
|
|||
|
{
|
|||
|
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
|
|||
|
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
|
|||
|
long long start;
|
|||
|
long long offset;
|
|||
|
|
|||
|
if (NULL == pItem)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : item is NULL\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
offset = pImage->ItemTable[pItem->index].offsetHi;
|
|||
|
offset <<= 32;
|
|||
|
offset |= pImage->ItemTable[pItem->index].offsetLo;
|
|||
|
start = offset/512;
|
|||
|
|
|||
|
return (uint)start;
|
|||
|
}
|
|||
|
|
|||
|
uint Img_ReadItem(HIMAGE hImage, HIMAGEITEM hItem, void *buffer, uint buffer_size)
|
|||
|
{
|
|||
|
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
|
|||
|
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
|
|||
|
long long start;
|
|||
|
long long offset;
|
|||
|
uint file_size;
|
|||
|
|
|||
|
if (NULL == pItem)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : item is NULL\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if(pImage->ItemTable[pItem->index].filelenHi)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : the item too big\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
file_size = pImage->ItemTable[pItem->index].filelenLo;
|
|||
|
file_size = (file_size + 1023) & (~(1024 - 1));
|
|||
|
if(file_size > buffer_size)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : buffer is smaller than data size\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
offset = pImage->ItemTable[pItem->index].offsetHi;
|
|||
|
offset <<= 32;
|
|||
|
offset |= pImage->ItemTable[pItem->index].offsetLo;
|
|||
|
//start = offset/512;
|
|||
|
start = offset;
|
|||
|
|
|||
|
fseek(img_file_hd, (uint)start, SEEK_SET);
|
|||
|
if(!fread(buffer, file_size, 1, img_file_hd))
|
|||
|
{
|
|||
|
printf("sunxi sprite error : read item data failed\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
return file_size;
|
|||
|
}
|
|||
|
|
|||
|
uint Img_ReadItem_Continue(HIMAGE hImage, HIMAGEITEM hItem, void *buffer, uint wanted_size, uint file_offset)
|
|||
|
{
|
|||
|
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
|
|||
|
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
|
|||
|
long long offset;
|
|||
|
|
|||
|
if (NULL == pItem)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : item is NULL\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if(pImage->ItemTable[pItem->index].filelenHi)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : the item too big\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
offset = pImage->ItemTable[pItem->index].offsetHi;
|
|||
|
offset <<= 32;
|
|||
|
offset |= pImage->ItemTable[pItem->index].offsetLo;
|
|||
|
|
|||
|
fseek(img_file_hd, (uint)offset + file_offset, SEEK_SET);
|
|||
|
if(!fread(buffer, wanted_size, 1, img_file_hd))
|
|||
|
{
|
|||
|
printf("sunxi sprite error : read item data failed\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
return wanted_size;
|
|||
|
}
|
|||
|
int Img_CloseItem (HIMAGE hImage, HIMAGEITEM hItem)
|
|||
|
{
|
|||
|
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
|
|||
|
if (NULL == pItem)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : item is null when close it\n");
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
free(pItem);
|
|||
|
pItem = NULL;
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
void Img_Close (HIMAGE hImage)
|
|||
|
{
|
|||
|
IMAGE_HANDLE * pImage = (IMAGE_HANDLE *)hImage;
|
|||
|
|
|||
|
if (NULL == pImage)
|
|||
|
{
|
|||
|
printf("sunxi sprite error : imghead is null when close it\n");
|
|||
|
|
|||
|
return ;
|
|||
|
}
|
|||
|
|
|||
|
if (NULL != pImage->ItemTable)
|
|||
|
{
|
|||
|
free(pImage->ItemTable);
|
|||
|
pImage->ItemTable = NULL;
|
|||
|
}
|
|||
|
|
|||
|
memset(pImage, 0, sizeof(IMAGE_HANDLE));
|
|||
|
free(pImage);
|
|||
|
pImage = NULL;
|
|||
|
|
|||
|
if(img_file_hd)
|
|||
|
{
|
|||
|
fclose(img_file_hd);
|
|||
|
}
|
|||
|
|
|||
|
return ;
|
|||
|
}
|