Back to home page

OSCL-LXR

 
 

    


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