Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:13:11

0001 #ifndef FWCore_Utilities_CRC16_h
0002 #define FWCore_Utilities_CRC16_h 1
0003 
0004 //
0005 // Calculates the 16bit CRC (applied to 64-bit words) used in the daq hardware
0006 // Do not modify without contacting Philipp Schieferdecker/Emilio Meschi
0007 // It is in FWCore/Utilities to avoid dependencies on xdaq
0008 //
0009 #include <cassert>
0010 
0011 namespace evf {
0012   unsigned short compute_crc(unsigned char* buffer, unsigned int bufSize);
0013   unsigned short compute_crc_8bit(unsigned short crc, unsigned char data);
0014   unsigned short compute_crc_64bit(unsigned short crc, unsigned char* p);
0015 
0016   const unsigned short crc_table[256] = {
0017       0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011, 0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D,
0018       0x8027, 0x0022, 0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072, 0x0050, 0x8055, 0x805F, 0x005A,
0019       0x804B, 0x004E, 0x0044, 0x8041, 0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2, 0x00F0, 0x80F5,
0020       0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1, 0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
0021       0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082, 0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D,
0022       0x8197, 0x0192, 0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1, 0x01E0, 0x81E5, 0x81EF, 0x01EA,
0023       0x81FB, 0x01FE, 0x01F4, 0x81F1, 0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2, 0x0140, 0x8145,
0024       0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151, 0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
0025       0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132, 0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E,
0026       0x0104, 0x8101, 0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312, 0x0330, 0x8335, 0x833F, 0x033A,
0027       0x832B, 0x032E, 0x0324, 0x8321, 0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371, 0x8353, 0x0356,
0028       0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342, 0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
0029       0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2, 0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD,
0030       0x83B7, 0x03B2, 0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381, 0x0280, 0x8285, 0x828F, 0x028A,
0031       0x829B, 0x029E, 0x0294, 0x8291, 0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2, 0x82E3, 0x02E6,
0032       0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2, 0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
0033       0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252, 0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E,
0034       0x0264, 0x8261, 0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231, 0x8213, 0x0216, 0x021C, 0x8219,
0035       0x0208, 0x820D, 0x8207, 0x0202};
0036 
0037 }  // namespace evf
0038 
0039 #endif
0040 
0041 ////////////////////////////////////////////////////////////////////////////////
0042 // inline implementations
0043 ////////////////////////////////////////////////////////////////////////////////
0044 
0045 //______________________________________________________________________________
0046 inline unsigned short evf::compute_crc(unsigned char* buffer, unsigned int bufSize) {
0047   assert(0 == bufSize % 8);
0048   unsigned short crc(0xffff);
0049   bufSize /= 8;
0050   for (unsigned int i = 0; i < bufSize; i++)
0051     crc = evf::compute_crc_64bit(crc, &buffer[i * 8]);
0052   return crc;
0053 }
0054 
0055 //______________________________________________________________________________
0056 inline unsigned short evf::compute_crc_8bit(unsigned short crc, unsigned char data) {
0057   return (evf::crc_table[((crc >> 8) ^ data) & 0xFF] ^ (crc << 8));
0058 }
0059 
0060 //______________________________________________________________________________
0061 inline unsigned short evf::compute_crc_64bit(unsigned short crc, unsigned char* p64) {
0062   unsigned short result(crc);
0063   for (int i = 7; i >= 0; i--)
0064     result = evf::compute_crc_8bit(result, p64[i]);
0065   return result;
0066 }