Skip to content

Commit ad24152

Browse files
Jan NikitenkoLinus Torvalds
Jan Nikitenko
authored and
Linus Torvalds
committed
CRC7 support
Add CRC7 routines, used for example in MMC over SPI communication. Kerneldoc updates [[email protected]: fix funny mix of const and non-const] Signed-off-by: Jan Nikitenko <[email protected]> Signed-off-by: David Brownell <[email protected]> Cc: "Randy.Dunlap" <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent c06e677 commit ad24152

File tree

5 files changed

+94
-1
lines changed

5 files changed

+94
-1
lines changed

Documentation/DocBook/kernel-api.tmpl

+3-1
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,10 @@ X!Ilib/string.c
139139
!Elib/cmdline.c
140140
</sect1>
141141

142-
<sect1><title>CRC Functions</title>
142+
<sect1 id="crc"><title>CRC Functions</title>
143+
!Elib/crc7.c
143144
!Elib/crc16.c
145+
!Elib/crc-itu-t.c
144146
!Elib/crc32.c
145147
!Elib/crc-ccitt.c
146148
</sect1>

include/linux/crc7.h

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef _LINUX_CRC7_H
2+
#define _LINUX_CRC7_H
3+
#include <linux/types.h>
4+
5+
extern const u8 crc7_syndrome_table[256];
6+
7+
static inline u8 crc7_byte(u8 crc, u8 data)
8+
{
9+
return crc7_syndrome_table[(crc << 1) ^ data];
10+
}
11+
12+
extern u8 crc7(u8 crc, const u8 *buffer, size_t len);
13+
14+
#endif

lib/Kconfig

+8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ config CRC32
4141
kernel tree does. Such modules that use library CRC32 functions
4242
require M here.
4343

44+
config CRC7
45+
tristate "CRC7 functions"
46+
help
47+
This option is provided for the case where no in-kernel-tree
48+
modules require CRC7 functions, but a module built outside
49+
the kernel tree does. Such modules that use library CRC7
50+
functions require M here.
51+
4452
config LIBCRC32C
4553
tristate "CRC32c (Castagnoli, et al) Cyclic Redundancy-Check"
4654
help

lib/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o
4343
obj-$(CONFIG_CRC16) += crc16.o
4444
obj-$(CONFIG_CRC_ITU_T) += crc-itu-t.o
4545
obj-$(CONFIG_CRC32) += crc32.o
46+
obj-$(CONFIG_CRC7) += crc7.o
4647
obj-$(CONFIG_LIBCRC32C) += libcrc32c.o
4748
obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o
4849

lib/crc7.c

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* crc7.c
3+
*
4+
* This source code is licensed under the GNU General Public License,
5+
* Version 2. See the file COPYING for more details.
6+
*/
7+
8+
#include <linux/types.h>
9+
#include <linux/module.h>
10+
#include <linux/crc7.h>
11+
12+
13+
/* Table for CRC-7 (polynomial x^7 + x^3 + 1) */
14+
const u8 crc7_syndrome_table[256] = {
15+
0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f,
16+
0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77,
17+
0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26,
18+
0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e,
19+
0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d,
20+
0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45,
21+
0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14,
22+
0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c,
23+
0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b,
24+
0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13,
25+
0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42,
26+
0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a,
27+
0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69,
28+
0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21,
29+
0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70,
30+
0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38,
31+
0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e,
32+
0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36,
33+
0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67,
34+
0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f,
35+
0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c,
36+
0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04,
37+
0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55,
38+
0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d,
39+
0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a,
40+
0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52,
41+
0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03,
42+
0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b,
43+
0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28,
44+
0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60,
45+
0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31,
46+
0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79
47+
};
48+
EXPORT_SYMBOL(crc7_syndrome_table);
49+
50+
/**
51+
* crc7 - update the CRC7 for the data buffer
52+
* @crc: previous CRC7 value
53+
* @buffer: data pointer
54+
* @len: number of bytes in the buffer
55+
* Context: any
56+
*
57+
* Returns the updated CRC7 value.
58+
*/
59+
u8 crc7(u8 crc, const u8 *buffer, size_t len)
60+
{
61+
while (len--)
62+
crc = crc7_byte(crc, *buffer++);
63+
return crc;
64+
}
65+
EXPORT_SYMBOL(crc7);
66+
67+
MODULE_DESCRIPTION("CRC7 calculations");
68+
MODULE_LICENSE("GPL");

0 commit comments

Comments
 (0)