Back to home page

LXR

 
 

    


0001 /*
0002  *      crc7.c
0003  *
0004  * This source code is licensed under the GNU General Public License,
0005  * Version 2. See the file COPYING for more details.
0006  */
0007 
0008 #include <linux/types.h>
0009 #include <linux/module.h>
0010 #include <linux/crc7.h>
0011 
0012 
0013 /*
0014  * Table for CRC-7 (polynomial x^7 + x^3 + 1).
0015  * This is a big-endian CRC (msbit is highest power of x),
0016  * aligned so the msbit of the byte is the x^6 coefficient
0017  * and the lsbit is not used.
0018  */
0019 const u8 crc7_be_syndrome_table[256] = {
0020     0x00, 0x12, 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e,
0021     0x90, 0x82, 0xb4, 0xa6, 0xd8, 0xca, 0xfc, 0xee,
0022     0x32, 0x20, 0x16, 0x04, 0x7a, 0x68, 0x5e, 0x4c,
0023     0xa2, 0xb0, 0x86, 0x94, 0xea, 0xf8, 0xce, 0xdc,
0024     0x64, 0x76, 0x40, 0x52, 0x2c, 0x3e, 0x08, 0x1a,
0025     0xf4, 0xe6, 0xd0, 0xc2, 0xbc, 0xae, 0x98, 0x8a,
0026     0x56, 0x44, 0x72, 0x60, 0x1e, 0x0c, 0x3a, 0x28,
0027     0xc6, 0xd4, 0xe2, 0xf0, 0x8e, 0x9c, 0xaa, 0xb8,
0028     0xc8, 0xda, 0xec, 0xfe, 0x80, 0x92, 0xa4, 0xb6,
0029     0x58, 0x4a, 0x7c, 0x6e, 0x10, 0x02, 0x34, 0x26,
0030     0xfa, 0xe8, 0xde, 0xcc, 0xb2, 0xa0, 0x96, 0x84,
0031     0x6a, 0x78, 0x4e, 0x5c, 0x22, 0x30, 0x06, 0x14,
0032     0xac, 0xbe, 0x88, 0x9a, 0xe4, 0xf6, 0xc0, 0xd2,
0033     0x3c, 0x2e, 0x18, 0x0a, 0x74, 0x66, 0x50, 0x42,
0034     0x9e, 0x8c, 0xba, 0xa8, 0xd6, 0xc4, 0xf2, 0xe0,
0035     0x0e, 0x1c, 0x2a, 0x38, 0x46, 0x54, 0x62, 0x70,
0036     0x82, 0x90, 0xa6, 0xb4, 0xca, 0xd8, 0xee, 0xfc,
0037     0x12, 0x00, 0x36, 0x24, 0x5a, 0x48, 0x7e, 0x6c,
0038     0xb0, 0xa2, 0x94, 0x86, 0xf8, 0xea, 0xdc, 0xce,
0039     0x20, 0x32, 0x04, 0x16, 0x68, 0x7a, 0x4c, 0x5e,
0040     0xe6, 0xf4, 0xc2, 0xd0, 0xae, 0xbc, 0x8a, 0x98,
0041     0x76, 0x64, 0x52, 0x40, 0x3e, 0x2c, 0x1a, 0x08,
0042     0xd4, 0xc6, 0xf0, 0xe2, 0x9c, 0x8e, 0xb8, 0xaa,
0043     0x44, 0x56, 0x60, 0x72, 0x0c, 0x1e, 0x28, 0x3a,
0044     0x4a, 0x58, 0x6e, 0x7c, 0x02, 0x10, 0x26, 0x34,
0045     0xda, 0xc8, 0xfe, 0xec, 0x92, 0x80, 0xb6, 0xa4,
0046     0x78, 0x6a, 0x5c, 0x4e, 0x30, 0x22, 0x14, 0x06,
0047     0xe8, 0xfa, 0xcc, 0xde, 0xa0, 0xb2, 0x84, 0x96,
0048     0x2e, 0x3c, 0x0a, 0x18, 0x66, 0x74, 0x42, 0x50,
0049     0xbe, 0xac, 0x9a, 0x88, 0xf6, 0xe4, 0xd2, 0xc0,
0050     0x1c, 0x0e, 0x38, 0x2a, 0x54, 0x46, 0x70, 0x62,
0051     0x8c, 0x9e, 0xa8, 0xba, 0xc4, 0xd6, 0xe0, 0xf2
0052 };
0053 EXPORT_SYMBOL(crc7_be_syndrome_table);
0054 
0055 /**
0056  * crc7 - update the CRC7 for the data buffer
0057  * @crc:     previous CRC7 value
0058  * @buffer:  data pointer
0059  * @len:     number of bytes in the buffer
0060  * Context: any
0061  *
0062  * Returns the updated CRC7 value.
0063  * The CRC7 is left-aligned in the byte (the lsbit is always 0), as that
0064  * makes the computation easier, and all callers want it in that form.
0065  *
0066  */
0067 u8 crc7_be(u8 crc, const u8 *buffer, size_t len)
0068 {
0069     while (len--)
0070         crc = crc7_be_byte(crc, *buffer++);
0071     return crc;
0072 }
0073 EXPORT_SYMBOL(crc7_be);
0074 
0075 MODULE_DESCRIPTION("CRC7 calculations");
0076 MODULE_LICENSE("GPL");