blob: 6fa4e93ed17c4b98079bd4926908cb3bdeee1429 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: eCos-2.0
Wolfgang Denkcf48eb92006-04-16 10:51:58 +02002/*
3 *==========================================================================
4 *
Pali Rohárbb3d71b2022-04-12 11:20:40 +02005 * crc16-ccitt.c
Wolfgang Denkcf48eb92006-04-16 10:51:58 +02006 *
7 * 16 bit CRC with polynomial x^16+x^12+x^5+1
8 *
9 *==========================================================================
Wolfgang Denkcf48eb92006-04-16 10:51:58 +020010 *#####DESCRIPTIONBEGIN####
11 *
12 * Author(s): gthomas
13 * Contributors: gthomas,asl
14 * Date: 2001-01-31
15 * Purpose:
16 * Description:
17 *
18 * This code is part of eCos (tm).
19 *
20 *####DESCRIPTIONEND####
21 *
22 *==========================================================================
23 */
Markus Klotzbuecherf2841d32006-03-30 13:40:55 +020024
Philipp Tomsich51c23452018-11-25 19:22:19 +010025#ifdef USE_HOSTCC
26#include <arpa/inet.h>
Philipp Tomsich51c23452018-11-25 19:22:19 +010027#endif
Philipp Tomsicha740ee92018-11-25 19:22:18 +010028#include <u-boot/crc.h>
Markus Klotzbuecherf2841d32006-03-30 13:40:55 +020029
Wolfgang Denkcf48eb92006-04-16 10:51:58 +020030/* Table of CRC constants - implements x^16+x^12+x^5+1 */
Markus Klotzbuecherf2841d32006-03-30 13:40:55 +020031static const uint16_t crc16_tab[] = {
Stefan Roese71091572016-03-03 09:34:11 +010032 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
33 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
34 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
35 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
36 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
37 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
38 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
39 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
40 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
41 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
42 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
43 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
44 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
45 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
46 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
47 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
48 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
49 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
50 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
51 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
52 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
53 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
54 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
55 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
56 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
57 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
58 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
59 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
60 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
61 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
62 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
63 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
Markus Klotzbuecherf2841d32006-03-30 13:40:55 +020064};
65
Philipp Tomsich51c23452018-11-25 19:22:19 +010066uint16_t crc16_ccitt(uint16_t cksum, const unsigned char *buf, int len)
Markus Klotzbuecherf2841d32006-03-30 13:40:55 +020067{
Philipp Tomsich51c23452018-11-25 19:22:19 +010068 for (int i = 0; i < len; i++)
Stefan Roese71091572016-03-03 09:34:11 +010069 cksum = crc16_tab[((cksum>>8) ^ *buf++) & 0xff] ^ (cksum << 8);
70
71 return cksum;
Markus Klotzbuecherf2841d32006-03-30 13:40:55 +020072}
Philipp Tomsich51c23452018-11-25 19:22:19 +010073
74void crc16_ccitt_wd_buf(const uint8_t *in, uint len,
75 uint8_t *out, uint chunk_sz)
76{
77 uint16_t crc;
78
79 crc = crc16_ccitt(0, in, len);
80 crc = htons(crc);
81 memcpy(out, &crc, sizeof(crc));
82}