static unsigned int CRCtbl[256];


static unsigned int calcCRC(unsigned char  data, unsigned int  genPoly)
{
    int i;
    unsigned int crc = data;

    for (i = 8; i; i--)
    {
        if (crc & 1)
        {
            crc = (crc >> 1) ^ genPoly;
        }
        else
        {
            crc >>= 1;
        }
    }

    return crc;
}


void initCRCSmmt(unsigned int  genPoly)
{
    unsigned int data;

    for (data = 0; data < 256; data++)
    {
        CRCtbl[data] = calcCRC(data, genPoly);
    }
}


unsigned int add2CRCSmmt(unsigned char  newData, unsigned int  oldCRC)
{
    return (oldCRC >> 8) ^ CRCtbl[(oldCRC & 0xFF) ^ newData];
}

