Files
E502_ADC_BF_PC_companion/x502api-1.1.34/lib/crc/fast_crc.c

208 lines
10 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*================================================================================================*
* Контрольные суммы CRC-16 и CRC-32 с повышенной скоростью вычислений
*================================================================================================*/
#include "fast_crc.h"
#if FASTCRC_CRC32_BLOCK8
/*================================================================================================*/
/* Table of CRC-32s of all single-byte values */
static const FASTCRC_U32_TYPE f_crc_table[256] =
{
0x00000000UL, 0x77073096UL, 0xEE0E612CUL, 0x990951BAUL, 0x076DC419UL,
0x706AF48FUL, 0xE963A535UL, 0x9E6495A3UL, 0x0EDB8832UL, 0x79DCB8A4UL,
0xE0D5E91EUL, 0x97D2D988UL, 0x09B64C2BUL, 0x7EB17CBDUL, 0xE7B82D07UL,
0x90BF1D91UL, 0x1DB71064UL, 0x6AB020F2UL, 0xF3B97148UL, 0x84BE41DEUL,
0x1ADAD47DUL, 0x6DDDE4EBUL, 0xF4D4B551UL, 0x83D385C7UL, 0x136C9856UL,
0x646BA8C0UL, 0xFD62F97AUL, 0x8A65C9ECUL, 0x14015C4FUL, 0x63066CD9UL,
0xFA0F3D63UL, 0x8D080DF5UL, 0x3B6E20C8UL, 0x4C69105EUL, 0xD56041E4UL,
0xA2677172UL, 0x3C03E4D1UL, 0x4B04D447UL, 0xD20D85FDUL, 0xA50AB56BUL,
0x35B5A8FAUL, 0x42B2986CUL, 0xDBBBC9D6UL, 0xACBCF940UL, 0x32D86CE3UL,
0x45DF5C75UL, 0xDCD60DCFUL, 0xABD13D59UL, 0x26D930ACUL, 0x51DE003AUL,
0xC8D75180UL, 0xBFD06116UL, 0x21B4F4B5UL, 0x56B3C423UL, 0xCFBA9599UL,
0xB8BDA50FUL, 0x2802B89EUL, 0x5F058808UL, 0xC60CD9B2UL, 0xB10BE924UL,
0x2F6F7C87UL, 0x58684C11UL, 0xC1611DABUL, 0xB6662D3DUL, 0x76DC4190UL,
0x01DB7106UL, 0x98D220BCUL, 0xEFD5102AUL, 0x71B18589UL, 0x06B6B51FUL,
0x9FBFE4A5UL, 0xE8B8D433UL, 0x7807C9A2UL, 0x0F00F934UL, 0x9609A88EUL,
0xE10E9818UL, 0x7F6A0DBBUL, 0x086D3D2DUL, 0x91646C97UL, 0xE6635C01UL,
0x6B6B51F4UL, 0x1C6C6162UL, 0x856530D8UL, 0xF262004EUL, 0x6C0695EDUL,
0x1B01A57BUL, 0x8208F4C1UL, 0xF50FC457UL, 0x65B0D9C6UL, 0x12B7E950UL,
0x8BBEB8EAUL, 0xFCB9887CUL, 0x62DD1DDFUL, 0x15DA2D49UL, 0x8CD37CF3UL,
0xFBD44C65UL, 0x4DB26158UL, 0x3AB551CEUL, 0xA3BC0074UL, 0xD4BB30E2UL,
0x4ADFA541UL, 0x3DD895D7UL, 0xA4D1C46DUL, 0xD3D6F4FBUL, 0x4369E96AUL,
0x346ED9FCUL, 0xAD678846UL, 0xDA60B8D0UL, 0x44042D73UL, 0x33031DE5UL,
0xAA0A4C5FUL, 0xDD0D7CC9UL, 0x5005713CUL, 0x270241AAUL, 0xBE0B1010UL,
0xC90C2086UL, 0x5768B525UL, 0x206F85B3UL, 0xB966D409UL, 0xCE61E49FUL,
0x5EDEF90EUL, 0x29D9C998UL, 0xB0D09822UL, 0xC7D7A8B4UL, 0x59B33D17UL,
0x2EB40D81UL, 0xB7BD5C3BUL, 0xC0BA6CADUL, 0xEDB88320UL, 0x9ABFB3B6UL,
0x03B6E20CUL, 0x74B1D29AUL, 0xEAD54739UL, 0x9DD277AFUL, 0x04DB2615UL,
0x73DC1683UL, 0xE3630B12UL, 0x94643B84UL, 0x0D6D6A3EUL, 0x7A6A5AA8UL,
0xE40ECF0BUL, 0x9309FF9DUL, 0x0A00AE27UL, 0x7D079EB1UL, 0xF00F9344UL,
0x8708A3D2UL, 0x1E01F268UL, 0x6906C2FEUL, 0xF762575DUL, 0x806567CBUL,
0x196C3671UL, 0x6E6B06E7UL, 0xFED41B76UL, 0x89D32BE0UL, 0x10DA7A5AUL,
0x67DD4ACCUL, 0xF9B9DF6FUL, 0x8EBEEFF9UL, 0x17B7BE43UL, 0x60B08ED5UL,
0xD6D6A3E8UL, 0xA1D1937EUL, 0x38D8C2C4UL, 0x4FDFF252UL, 0xD1BB67F1UL,
0xA6BC5767UL, 0x3FB506DDUL, 0x48B2364BUL, 0xD80D2BDAUL, 0xAF0A1B4CUL,
0x36034AF6UL, 0x41047A60UL, 0xDF60EFC3UL, 0xA867DF55UL, 0x316E8EEFUL,
0x4669BE79UL, 0xCB61B38CUL, 0xBC66831AUL, 0x256FD2A0UL, 0x5268E236UL,
0xCC0C7795UL, 0xBB0B4703UL, 0x220216B9UL, 0x5505262FUL, 0xC5BA3BBEUL,
0xB2BD0B28UL, 0x2BB45A92UL, 0x5CB36A04UL, 0xC2D7FFA7UL, 0xB5D0CF31UL,
0x2CD99E8BUL, 0x5BDEAE1DUL, 0x9B64C2B0UL, 0xEC63F226UL, 0x756AA39CUL,
0x026D930AUL, 0x9C0906A9UL, 0xEB0E363FUL, 0x72076785UL, 0x05005713UL,
0x95BF4A82UL, 0xE2B87A14UL, 0x7BB12BAEUL, 0x0CB61B38UL, 0x92D28E9BUL,
0xE5D5BE0DUL, 0x7CDCEFB7UL, 0x0BDBDF21UL, 0x86D3D2D4UL, 0xF1D4E242UL,
0x68DDB3F8UL, 0x1FDA836EUL, 0x81BE16CDUL, 0xF6B9265BUL, 0x6FB077E1UL,
0x18B74777UL, 0x88085AE6UL, 0xFF0F6A70UL, 0x66063BCAUL, 0x11010B5CUL,
0x8F659EFFUL, 0xF862AE69UL, 0x616BFFD3UL, 0x166CCF45UL, 0xA00AE278UL,
0xD70DD2EEUL, 0x4E048354UL, 0x3903B3C2UL, 0xA7672661UL, 0xD06016F7UL,
0x4969474DUL, 0x3E6E77DBUL, 0xAED16A4AUL, 0xD9D65ADCUL, 0x40DF0B66UL,
0x37D83BF0UL, 0xA9BCAE53UL, 0xDEBB9EC5UL, 0x47B2CF7FUL, 0x30B5FFE9UL,
0xBDBDF21CUL, 0xCABAC28AUL, 0x53B39330UL, 0x24B4A3A6UL, 0xBAD03605UL,
0xCDD70693UL, 0x54DE5729UL, 0x23D967BFUL, 0xB3667A2EUL, 0xC4614AB8UL,
0x5D681B02UL, 0x2A6F2B94UL, 0xB40BBE37UL, 0xC30C8EA1UL, 0x5A05DF1BUL,
0x2D02EF8DUL
};
/*================================================================================================*/
#endif
/*================================================================================================*/
/* Вычисление CRC16 (CCITT, 0x1021) */
#if FASTCRC_CRC16_ADD8
/*------------------------------------------------------------------------------------------------*/
FASTCRC_U16_TYPE CRC16_Add8 /* Добавление байта */
(
FASTCRC_U16_TYPE crc, /* (вх) - начальное значение */
FASTCRC_U8_TYPE byte /* (вх) - данные */
)
{
/* Оптимизированный алгоритм без цикла по битам */
/* Original code by Ashley Roll */
register FASTCRC_U16_TYPE x = ((crc >> 8) ^ byte) & 0xFF;
x ^= (x >> 4);
return (crc << 8) ^ (x << 12) ^ (x << 5) ^ x;
}
/*------------------------------------------------------------------------------------------------*/
#endif
#if FASTCRC_CRC16_ADD16
/*------------------------------------------------------------------------------------------------*/
FASTCRC_U16_TYPE CRC16_Add16 /* Добавление 16-битного слова (младший байт первым) */
(
FASTCRC_U16_TYPE crc, /* (вх) - начальное значение */
FASTCRC_U16_TYPE word /* (вх) - данные */
)
{
/* Оптимизированный алгоритм без цикла по битам */
/* Наличие преимущества в скорости по сравнению с двумя CRC16_Add8() зависит от системы */
register FASTCRC_U16_TYPE y = ((crc >> 8) ^ word) & 0xFF;
register FASTCRC_U16_TYPE z = (crc ^ (word >> 8)) & 0xFF;
register FASTCRC_U16_TYPE t = y ^ z;
register FASTCRC_U16_TYPE q = (y ^ (y << 1)) << 12;
t ^= (t >> 4);
t ^= (y >> 3);
q ^= (q >> 4);
z ^= (z >> 4);
return t ^ (t << 5) ^ (y << 4) ^ (z << 12) ^ q;
}
/*------------------------------------------------------------------------------------------------*/
#endif
#if FASTCRC_CRC16_BLOCK8
/*------------------------------------------------------------------------------------------------*/
FASTCRC_U16_TYPE CRC16_Block8 /* Вычисление CRC16 блока байтов */
(
FASTCRC_U16_TYPE crc, /* (вх) - начальное значение */
const FASTCRC_U8_TYPE* pdata, /* (вх) - данные */
FASTCRC_SIZE_TYPE num_bytes /* (вх) - размер данных */
)
{
/* Оптимизированный алгоритм без цикла по битам */
/* Original code by Ashley Roll */
if (pdata)
{
register FASTCRC_U16_TYPE x;
while (num_bytes--)
{
x = ((crc >> 8) ^ (*pdata++)) & 0xFF;
x ^= (x >> 4);
crc = (crc << 8) ^ (x << 12) ^ (x << 5) ^ x;
}
}
return crc;
}
/*------------------------------------------------------------------------------------------------*/
#endif
#if FASTCRC_CRC16_BLOCK16
/*------------------------------------------------------------------------------------------------*/
FASTCRC_U16_TYPE CRC16_Block16 /* Вычисление CRC16 блока 16-битных слов */
(
FASTCRC_U16_TYPE crc, /* (вх) - начальное значение */
const FASTCRC_U16_TYPE* pdata, /* (вх) - данные */
FASTCRC_SIZE_TYPE num_words /* (вх) - размер данных */
)
{
/* Оптимизированный алгоритм без цикла по битам */
/* Наличие преимущества в скорости по сравнению с двумя CRC16_Add8() зависит от системы */
if (pdata)
{
register FASTCRC_U16_TYPE y, z, t, q;
while (num_words--)
{
t = *pdata++;
y = ((crc >> 8) ^ t) & 0xFF;
z = (crc ^ (t >> 8)) & 0xFF;
t = y ^ z;
q = (y ^ (y << 1)) << 12;
t ^= (t >> 4);
t ^= (y >> 3);
q ^= (q >> 4);
z ^= (z >> 4);
crc = t ^ (t << 5) ^ (y << 4) ^ (z << 12) ^ q;
}
}
return crc;
}
/*------------------------------------------------------------------------------------------------*/
#endif
/* Вычисление CRC32 (CCITT) */
#if FASTCRC_CRC32_BLOCK8
/*------------------------------------------------------------------------------------------------*/
/* crc32 -- compute the CRC-32 of a data stream
* Copyright (C) 1995-2005 Mark Adler
*
* THIS VERSION HAS BEEN MODIFIED:
* No BYFOUR code (fast, but requires 8 tables)
* No dynamic table generation
* CRC concatenation function removed
* Code reformatted for cosmetic uniformity
*/
FASTCRC_U32_TYPE CRC32_Block8 /* Вычисление CRC32 блока байтов */
(
FASTCRC_U32_TYPE crc, /* (вх) - начальное значение (при первом блоке 0) */
const FASTCRC_U8_TYPE* pdata, /* (вх) - данные */
FASTCRC_SIZE_TYPE num_bytes /* (вх) - размер данных */
)
{
#define DO1 crc = f_crc_table[(crc ^ (*pdata++)) & 0xFF] ^ (crc >> 8)
if (!pdata) return crc;
crc ^= 0xFFFFFFFFUL;
while (num_bytes >= 8)
{
DO1; DO1; DO1; DO1;
DO1; DO1; DO1; DO1;
num_bytes -= 8;
}
if (num_bytes) do
{
DO1;
}
while (--num_bytes);
return crc ^ 0xFFFFFFFFUL;
#undef DO1
}
/*------------------------------------------------------------------------------------------------*/
#endif
/*================================================================================================*/