Files
ihexparse/ihexparse.c
T
jens e3ae10069e Initial import
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/ihexparse@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
2014-07-19 07:44:42 +00:00

109 lines
2.2 KiB
C
Executable File

/*************************************************************************/
/* 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);
}