CMS 3D CMS Logo

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

Generated on Tue Jun 9 17:36:41 2009 for CMSSW by  doxygen 1.5.4