| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | /******************************************************************************** Copyright 2011-2012, Cypress Semiconductor Corporation.  All rights reserved.* You may use this file only in accordance with the license, terms, conditions, * disclaimers, and limitations in the end user license agreement accompanying * the software package with which this file was provided.********************************************************************************/#include <string.h>#include "cybtldr_parse.h"/* Pointer to the *.cyacd file containing the data that is to be read */static FILE* dataFile;unsigned char CyBtldr_FromHex(char value){    if ('0' <= value && value <= '9')        return (unsigned char)(value - '0');    if ('a' <= value && value <= 'f')        return (unsigned char)(10 + value - 'a');    if ('A' <= value && value <= 'F')        return (unsigned char)(10 + value - 'A');    return 0;}int CyBtldr_FromAscii(unsigned int bufSize, unsigned char* buffer, unsigned short* rowSize, unsigned char* rowData){    unsigned short i;    int err = CYRET_SUCCESS;    if (bufSize & 1) // Make sure even number of bytes        err = CYRET_ERR_LENGTH;    else    {        for (i = 0; i < bufSize / 2; i++)        {            rowData[i] = (CyBtldr_FromHex(buffer[i * 2]) << 4) | CyBtldr_FromHex(buffer[i * 2 + 1]);        }        *rowSize = i;    }    return err;}int CyBtldr_ReadLine(unsigned int* size, char* buffer){    int err = CYRET_SUCCESS;    unsigned int len = 0;    if (NULL != dataFile && !feof(dataFile))    {        if (NULL != fgets(buffer, MAX_BUFFER_SIZE, dataFile))        {            len = strlen(buffer);            while (len > 0 && ('\n' == buffer[len - 1] || '\r' == buffer[len - 1]))                --len;        }        else            err = CYRET_ERR_EOF;    }    else        err = CYRET_ERR_FILE;    *size = len;    return err;}int CyBtldr_OpenDataFile(const char* file){    dataFile = fopen(file, "r");    return (NULL == dataFile)        ? CYRET_ERR_FILE        : CYRET_SUCCESS;}int CyBtldr_ParseHeader(unsigned int bufSize, unsigned char* buffer, unsigned long* siliconId, unsigned char* siliconRev, unsigned char* chksum){    const unsigned int LENGTH_ID     = 5;            //4-silicon id, 1-silicon rev    const unsigned int LENGTH_CHKSUM = LENGTH_ID + 1; //1-checksum type    unsigned short rowSize;    unsigned char rowData[MAX_BUFFER_SIZE];    int err = CyBtldr_FromAscii(bufSize, buffer, &rowSize, rowData);    if (CYRET_SUCCESS == err)    {        if (rowSize >= LENGTH_CHKSUM)            *chksum = rowData[5];        if (rowSize >= LENGTH_ID)        {            *siliconId = (rowData[0] << 24) | (rowData[1] << 16) | (rowData[2] << 8) | (rowData[3]);            *siliconRev = rowData[4];        }        else            err = CYRET_ERR_LENGTH;    }    return err;}int CyBtldr_ParseRowData(unsigned int bufSize, unsigned char* buffer, unsigned char* arrayId, unsigned short* rowNum, unsigned char* rowData, unsigned short* size, unsigned char* checksum){    const unsigned short MIN_SIZE = 6; //1-array, 2-addr, 2-size, 1-checksum    const int DATA_OFFSET = 5;    unsigned int i;    unsigned short hexSize;    unsigned char hexData[MAX_BUFFER_SIZE];    int err = CYRET_SUCCESS;    if (bufSize <= MIN_SIZE)        err = CYRET_ERR_LENGTH;    else if (buffer[0] == ':')    {        err = CyBtldr_FromAscii(bufSize - 1, &buffer[1], &hexSize, hexData);        *arrayId = hexData[0];        *rowNum = (hexData[1] << 8) | (hexData[2]);        *size = (hexData[3] << 8) | (hexData[4]);        *checksum = (hexData[hexSize - 1]);        if ((*size + MIN_SIZE) == hexSize)        {            for (i = 0; i < *size; i++)            {                rowData[i] = (hexData[DATA_OFFSET + i]);            }        }        else            err = CYRET_ERR_DATA;    }    else        err = CYRET_ERR_CMD;    return err;}int CyBtldr_CloseDataFile(void){    int err = 0;    if (NULL != dataFile)    {        err = fclose(dataFile);        dataFile = NULL;    }    return (0 == err)        ? CYRET_SUCCESS        : CYRET_ERR_FILE;}
 |