2019-06-03 08:44:46 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2007-07-17 15:04:03 +04:00
/*
* crc7 . c
*/
# include <linux/types.h>
# include <linux/module.h>
# include <linux/crc7.h>
2014-05-10 18:32:57 +04:00
/*
* Table for CRC - 7 ( polynomial x ^ 7 + x ^ 3 + 1 ) .
* This is a big - endian CRC ( msbit is highest power of x ) ,
* aligned so the msbit of the byte is the x ^ 6 coefficient
* and the lsbit is not used .
*/
const u8 crc7_be_syndrome_table [ 256 ] = {
0x00 , 0x12 , 0x24 , 0x36 , 0x48 , 0x5a , 0x6c , 0x7e ,
0x90 , 0x82 , 0xb4 , 0xa6 , 0xd8 , 0xca , 0xfc , 0xee ,
0x32 , 0x20 , 0x16 , 0x04 , 0x7a , 0x68 , 0x5e , 0x4c ,
0xa2 , 0xb0 , 0x86 , 0x94 , 0xea , 0xf8 , 0xce , 0xdc ,
0x64 , 0x76 , 0x40 , 0x52 , 0x2c , 0x3e , 0x08 , 0x1a ,
0xf4 , 0xe6 , 0xd0 , 0xc2 , 0xbc , 0xae , 0x98 , 0x8a ,
0x56 , 0x44 , 0x72 , 0x60 , 0x1e , 0x0c , 0x3a , 0x28 ,
0xc6 , 0xd4 , 0xe2 , 0xf0 , 0x8e , 0x9c , 0xaa , 0xb8 ,
0xc8 , 0xda , 0xec , 0xfe , 0x80 , 0x92 , 0xa4 , 0xb6 ,
0x58 , 0x4a , 0x7c , 0x6e , 0x10 , 0x02 , 0x34 , 0x26 ,
0xfa , 0xe8 , 0xde , 0xcc , 0xb2 , 0xa0 , 0x96 , 0x84 ,
0x6a , 0x78 , 0x4e , 0x5c , 0x22 , 0x30 , 0x06 , 0x14 ,
0xac , 0xbe , 0x88 , 0x9a , 0xe4 , 0xf6 , 0xc0 , 0xd2 ,
0x3c , 0x2e , 0x18 , 0x0a , 0x74 , 0x66 , 0x50 , 0x42 ,
0x9e , 0x8c , 0xba , 0xa8 , 0xd6 , 0xc4 , 0xf2 , 0xe0 ,
0x0e , 0x1c , 0x2a , 0x38 , 0x46 , 0x54 , 0x62 , 0x70 ,
0x82 , 0x90 , 0xa6 , 0xb4 , 0xca , 0xd8 , 0xee , 0xfc ,
0x12 , 0x00 , 0x36 , 0x24 , 0x5a , 0x48 , 0x7e , 0x6c ,
0xb0 , 0xa2 , 0x94 , 0x86 , 0xf8 , 0xea , 0xdc , 0xce ,
0x20 , 0x32 , 0x04 , 0x16 , 0x68 , 0x7a , 0x4c , 0x5e ,
0xe6 , 0xf4 , 0xc2 , 0xd0 , 0xae , 0xbc , 0x8a , 0x98 ,
0x76 , 0x64 , 0x52 , 0x40 , 0x3e , 0x2c , 0x1a , 0x08 ,
0xd4 , 0xc6 , 0xf0 , 0xe2 , 0x9c , 0x8e , 0xb8 , 0xaa ,
0x44 , 0x56 , 0x60 , 0x72 , 0x0c , 0x1e , 0x28 , 0x3a ,
0x4a , 0x58 , 0x6e , 0x7c , 0x02 , 0x10 , 0x26 , 0x34 ,
0xda , 0xc8 , 0xfe , 0xec , 0x92 , 0x80 , 0xb6 , 0xa4 ,
0x78 , 0x6a , 0x5c , 0x4e , 0x30 , 0x22 , 0x14 , 0x06 ,
0xe8 , 0xfa , 0xcc , 0xde , 0xa0 , 0xb2 , 0x84 , 0x96 ,
0x2e , 0x3c , 0x0a , 0x18 , 0x66 , 0x74 , 0x42 , 0x50 ,
0xbe , 0xac , 0x9a , 0x88 , 0xf6 , 0xe4 , 0xd2 , 0xc0 ,
0x1c , 0x0e , 0x38 , 0x2a , 0x54 , 0x46 , 0x70 , 0x62 ,
0x8c , 0x9e , 0xa8 , 0xba , 0xc4 , 0xd6 , 0xe0 , 0xf2
2007-07-17 15:04:03 +04:00
} ;
2014-05-10 18:32:57 +04:00
EXPORT_SYMBOL ( crc7_be_syndrome_table ) ;
2007-07-17 15:04:03 +04:00
/**
2021-01-14 11:04:43 +03:00
* crc7_be - update the CRC7 for the data buffer
2007-07-17 15:04:03 +04:00
* @ crc : previous CRC7 value
* @ buffer : data pointer
* @ len : number of bytes in the buffer
* Context : any
*
* Returns the updated CRC7 value .
2014-05-10 18:32:57 +04:00
* The CRC7 is left - aligned in the byte ( the lsbit is always 0 ) , as that
* makes the computation easier , and all callers want it in that form .
*
2007-07-17 15:04:03 +04:00
*/
2014-05-10 18:32:57 +04:00
u8 crc7_be ( u8 crc , const u8 * buffer , size_t len )
2007-07-17 15:04:03 +04:00
{
while ( len - - )
2014-05-10 18:32:57 +04:00
crc = crc7_be_byte ( crc , * buffer + + ) ;
2007-07-17 15:04:03 +04:00
return crc ;
}
2014-05-10 18:32:57 +04:00
EXPORT_SYMBOL ( crc7_be ) ;
2007-07-17 15:04:03 +04:00
MODULE_DESCRIPTION ( " CRC7 calculations " ) ;
MODULE_LICENSE ( " GPL " ) ;