Initial import
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/ihexparse@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
Executable
+108
@@ -0,0 +1,108 @@
|
||||
/*************************************************************************/
|
||||
/* ihexparse.h
|
||||
/*************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <types.h>
|
||||
#include <ihexparse.h>
|
||||
|
||||
UINT32 HexCreate(HEXREC *pObj, char *name)
|
||||
{
|
||||
pObj->pFile = fopen(name,"wa");
|
||||
if (pObj->pFile <= 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
UINT32 HexOpen(HEXREC *pObj, char *name)
|
||||
{
|
||||
pObj->pFile = fopen(name,"ra");
|
||||
if (pObj->pFile <= 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
UINT32 HexReadRecord(HEXREC *pObj)
|
||||
{
|
||||
UINT8 val8;
|
||||
UINT16 i;
|
||||
UINT32 val32;
|
||||
INT32 status;
|
||||
|
||||
val8 = 0;
|
||||
/* Read Record Start character */
|
||||
while (val8 != ':')
|
||||
{
|
||||
status = fscanf(pObj->pFile,"%c",&val8);
|
||||
if (status <= 0)
|
||||
return HEXREC_ERROR;
|
||||
}
|
||||
|
||||
/* Read Record Length */
|
||||
fscanf(pObj->pFile,"%2x",&pObj->length);
|
||||
|
||||
/* check if hex file is finished */
|
||||
if (pObj->length == 0)
|
||||
{
|
||||
status = fscanf(pObj->pFile,"%8x",&val32);
|
||||
if (status <= 0)
|
||||
return HEXREC_ERROR;
|
||||
if (val32 == 0x000001FF)
|
||||
return HEXREC_END;
|
||||
}
|
||||
|
||||
/* Read Start Address */
|
||||
fscanf(pObj->pFile,"%4x",&pObj->dataStart);
|
||||
|
||||
/* Read Record Type */
|
||||
fscanf(pObj->pFile,"%2x",&pObj->type);
|
||||
|
||||
/* Read Record Data */
|
||||
for (i=0; i <pObj->length; i++)
|
||||
fscanf(pObj->pFile,"%2x",&pObj->recData[i]);
|
||||
|
||||
/* Read Checksum */
|
||||
fscanf(pObj->pFile,"%2x",&pObj->checksum);
|
||||
if (pObj->checksum != HexCalcChecksum(pObj))
|
||||
return HEXREC_ERROR;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
UINT32 HexWriteRecord(HEXREC *pObj)
|
||||
{
|
||||
UINT16 i;
|
||||
|
||||
fprintf(pObj->pFile,":%2.2X%4.4X%2.2X",pObj->length,pObj->dataStart,pObj->type);
|
||||
|
||||
for (i=0; i < pObj->length; i++)
|
||||
fprintf(pObj->pFile, "%2.2X",pObj->recData[i]);
|
||||
|
||||
pObj->checksum = HexCalcChecksum(pObj);
|
||||
fprintf(pObj->pFile, "%2.2X\n",pObj->checksum);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
UINT32 HexClose(HEXREC *pObj)
|
||||
{
|
||||
pObj->length=0;
|
||||
pObj->type=0x01;
|
||||
pObj->dataStart=0x0000;
|
||||
return HexWriteRecord(pObj);
|
||||
}
|
||||
|
||||
UINT8 HexCalcChecksum(HEXREC *pObj)
|
||||
{
|
||||
UINT16 i;
|
||||
UINT8 sum;
|
||||
|
||||
sum = pObj->dataStart & 0xFF;
|
||||
sum += (pObj->dataStart >> 8) & 0xFF;
|
||||
sum += pObj->length + pObj->type;
|
||||
|
||||
for (i=0; i < pObj->length; i++)
|
||||
sum += pObj->recData[i];
|
||||
|
||||
return (0xFF - sum + 1);
|
||||
}
|
||||
Reference in New Issue
Block a user