CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/FWCore/Utilities/interface/CRC16.h

Go to the documentation of this file.
00001 #ifndef FWCore_Utilities_CRC16_h
00002 #define FWCore_Utilities_CRC16_h 1
00003 
00004 //
00005 // Calculates the 16bit CRC (applied to 64-bit words) used in the daq hardware
00006 // Do not modify without contacting Philipp Schieferdecker/Emilio Meschi 
00007 // It is in FWCore/Utilities to avoid dependencies on xdaq
00008 //
00009 #include <cassert>
00010 
00011 namespace evf
00012 {
00013   unsigned short compute_crc(unsigned char* buffer,unsigned int bufSize);
00014   unsigned short compute_crc_8bit(unsigned short crc,unsigned char data);
00015   unsigned short compute_crc_64bit(unsigned short crc,unsigned char* p);
00016   
00017   
00018   const unsigned short crc_table[256] =
00019     {
00020       0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
00021       0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,
00022       0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,
00023       0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,
00024       0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,
00025       0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,
00026       0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
00027       0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
00028       0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,
00029       0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,
00030       0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,
00031       0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,
00032       0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,
00033       0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
00034       0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
00035       0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,
00036       0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,
00037       0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,
00038       0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,
00039       0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,
00040       0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
00041       0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
00042       0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,
00043       0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,
00044       0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,
00045       0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,
00046       0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,
00047       0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
00048       0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
00049       0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,
00050       0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,
00051       0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202
00052     };
00053   
00054   
00055 }
00056 
00057 
00058 #endif
00059 
00060 
00062 // inline implementations
00064 
00065 //______________________________________________________________________________
00066 inline
00067 unsigned short evf::compute_crc(unsigned char* buffer,unsigned int bufSize)
00068 {
00069   assert(0==bufSize%8);
00070   unsigned short crc(0xffff);
00071   bufSize/=8;
00072   for (unsigned int i=0;i<bufSize;i++) crc=evf::compute_crc_64bit(crc,&buffer[i*8]);
00073   return crc;
00074 }
00075 
00076 
00077 //______________________________________________________________________________
00078 inline
00079 unsigned short evf::compute_crc_8bit(unsigned short crc,unsigned char data)
00080 {
00081   return (evf::crc_table[((crc >> 8) ^ data) & 0xFF] ^ (crc << 8));
00082 }
00083 
00084 
00085 //______________________________________________________________________________
00086 inline
00087 unsigned short evf::compute_crc_64bit(unsigned short crc,unsigned char *p64)
00088 {
00089   unsigned short result(crc);
00090   for (int i=7;i>=0;i--) result=evf::compute_crc_8bit(result,p64[i]);
00091   return result;
00092 }