blob: 6fa4e93ed17c4b98079bd4926908cb3bdeee1429 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: eCos-2.0
Wolfgang Denkebd3deb2006-04-16 10:51:58 +02002/*
3 *==========================================================================
4 *
Pali Rohár44406a32022-04-12 11:20:40 +02005 * crc16-ccitt.c
Wolfgang Denkebd3deb2006-04-16 10:51:58 +02006 *
7 * 16 bit CRC with polynomial x^16+x^12+x^5+1
8 *
9 *==========================================================================
Wolfgang Denkebd3deb2006-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 Klotzbuecher387f5412006-03-30 13:40:55 +020024
Philipp Tomsich6e2ac3e2018-11-25 19:22:19 +010025#ifdef USE_HOSTCC
26#include <arpa/inet.h>
Philipp Tomsich6e2ac3e2018-11-25 19:22:19 +010027#endif
Philipp Tomsich36b26d12018-11-25 19:22:18 +010028#include <u-boot/crc.h>
Markus Klotzbuecher387f5412006-03-30 13:40:55 +020029
Wolfgang Denkebd3deb2006-04-16 10:51:58 +020030/* Table of CRC constants - implements x^16+x^12+x^5+1 */
Markus Klotzbuecher387f5412006-03-30 13:40:55 +020031static const uint16_t crc16_tab[] = {
Stefan Roese9c2dbcb2016-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 Klotzbuecher387f5412006-03-30 13:40:55 +020064};
65
Philipp Tomsich6e2ac3e2018-11-25 19:22:19 +010066uint16_t crc16_ccitt(uint16_t cksum, const unsigned char *buf, int len)
Markus Klotzbuecher387f5412006-03-30 13:40:55 +020067{
Philipp Tomsich6e2ac3e2018-11-25 19:22:19 +010068 for (int i = 0; i < len; i++)
Stefan Roese9c2dbcb2016-03-03 09:34:11 +010069 cksum = crc16_tab[((cksum>>8) ^ *buf++) & 0xff] ^ (cksum << 8);
Markus Klotzbuecher387f5412006-03-30 13:40:55 +020070
Stefan Roese9c2dbcb2016-03-03 09:34:11 +010071 return cksum;
Markus Klotzbuecher387f5412006-03-30 13:40:55 +020072}
Philipp Tomsich6e2ac3e2018-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}