I need a XFP complient CRC code module. Or I need to validate the one that I got. So any help (pointers to code, pointers to XFP CRC spec, notes on how to validate) would help. Sean
What's XFP? The Dallas site has an Application Note on CRCs - it's specifically with reference to their 1-Wire MicroLAN technology, but the principles are general
10 Gig optical transceiver? TLAs are all overloaded, of course.
This seems to be it, it when used comes out as the same as a validation example I found on the web. Now I did not create this table, I found it on a french site, and just kept swapping tables (only once, i got lucky) until the validation results were there. I got the original wrong table from either Kiel or Cygnal or maybe phillips. /* * Function: Do_CRC8 * * Description: * Computes the CRC value given the byte and the old CRC value as a static value * * Return Value: CRC value * Parameters: Input data byte to be CRC'ed * Remarks: * uses a table driven method to speed things up. * * */ unsigned char Do_CRC8(unsigned char xx) { //This procedure calculates the cumulative Dallas Semiconductor // 1-Wire CRC of all bytes passed to it. The result //accumulates in the global variable CRC. const unsigned char code Table[256]={ 0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D, 0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D, 0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCB, 0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD, 0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA, 0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A, 0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A, 0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A, 0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4, 0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4, 0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44, 0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34, 0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63, 0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13, 0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83, 0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3 }; ucCRC=Table[ucCRC ^ xx]; return (ucCRC); }
so, does it look like it should work? Sean
XFP uses x^8 +X^2 + x^1 + 1 (really x^0 for the sleepy). Sean
Mostly (!) My table for this poly differs from yours. My table[47] is 0xCD, whereas yours is 0xCB. 0xCB is also in your table[247] where I believe it belongs, but the duplication I think demonstrates that the 0xCB in table[47] is not correct. The feedback table should have unique values throughout, should it not?
Graham Cole started a Thread about Linear Feedback Shift Registers (LFSRs) a while back; it had a link to a good site on the subject - might be worth a look? (use the 'Search')
"Now I did not create this table, I found it on a french site..." Something got muffed in the translation ;-) "...and just kept swapping tables (only once, i got lucky) until the validation results were there. The validation test must not have hit upon the one bad feedback table entry. "I got the original wrong table from either Kiel or Cygnal or maybe phillips." Actually, you probably got the right table from one of those locations -- right for Dallas One-Wire, that is. DOW does not use the same polynomial as the one you seem to need. So to be picky, you should probably remove the Dallas reference in your function's comment, lest it confuse someone down the road. The CRC/poly you are apparently needing is a common one found in a number of standards (e.g., IEEE 802.6-1990, ISO/IEC 13239) where 8-bit CRCs are used.
Oh, Thank you, you spared me from much hassle and fuss. Thank you, Sean
One of the things I wanted to have here was a place where anyone who had similar needs could come and be satisified. Between your comments and my code, I believe that this has been done. Keywords: (do they search the contents of the messages?) XFP SMBus PEC packet error correction CRC8 CRC-8. Well those are the ones that I used to try to find this place. I will repost the code with your excelent corrections: /* * Function: Do_CRC8 * * Description: * Computes the CRC value given the byte and the old CRC value as a static value * * Return Value: CRC value * Parameters: Input data byte to be CRC'ed * Remarks: * uses a table driven method to speed things up. * * */ unsigned char Do_CRC8(unsigned char xx) { // this procedure calculates const unsigned char code Table[256]={ 0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D, 0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D, 0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD, 0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD, 0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA, 0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A, 0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A, 0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A, 0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4, 0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4, 0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44, 0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34, 0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63, 0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13, 0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83, 0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3 }; ucCRC=Table[ucCRC ^ xx]; return (ucCRC); }
"...come and be satisified. OK Sean. Good job. To your contribution, I'll add another that uses a nibble-oriented feedback table for situations where one is tight on code space (for the table) and can give up a little performance.
/**************************************************************************** * * NAME: Crc8() * PURPOSE: Generate 8-bit CRC. * * SYNOPSIS: unsigned char Crc8(unsigned char b, unsigned char initCrc); * * INTERFACE PARAMETERS: * * Name FG-IO Description * ------------------- ----- ----------------------------------------- * b F I Data byte to CRC (MSBit first). * initCrc F I Initial CRC or CRC accumulator for * continuation. * <return value> O CRC. * * DESCRIPTION: * * The function returns the 8-bit CRC after including "b" with the * initial CRC "initCRC". * ****************************************************************************/ unsigned char Crc8(unsigned char b, unsigned char initCrc) { static const unsigned char code feedback[16] = { 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D }; #define CRC initCrc CRC = (CRC << 4) ^ feedback[((CRC ) ^ b) >> 4]; CRC = (CRC << 4) ^ feedback[((CRC >> 4) ^ b) & 0x0F]; return (CRC); #undef CRC }