/*************************************************************************/ /* ihexparse.h /*************************************************************************/ #include #include #include #include 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 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); }