183d290c5STom Rini // SPDX-License-Identifier: eCos-2.0
278acc472SPeter Tyser /*
378acc472SPeter Tyser *==========================================================================
478acc472SPeter Tyser *
578acc472SPeter Tyser * crc16.c
678acc472SPeter Tyser *
778acc472SPeter Tyser * 16 bit CRC with polynomial x^16+x^12+x^5+1
878acc472SPeter Tyser *
978acc472SPeter Tyser *==========================================================================
1078acc472SPeter Tyser *#####DESCRIPTIONBEGIN####
1178acc472SPeter Tyser *
1278acc472SPeter Tyser * Author(s): gthomas
1378acc472SPeter Tyser * Contributors: gthomas,asl
1478acc472SPeter Tyser * Date: 2001-01-31
1578acc472SPeter Tyser * Purpose:
1678acc472SPeter Tyser * Description:
1778acc472SPeter Tyser *
1878acc472SPeter Tyser * This code is part of eCos (tm).
1978acc472SPeter Tyser *
2078acc472SPeter Tyser *####DESCRIPTIONEND####
2178acc472SPeter Tyser *
2278acc472SPeter Tyser *==========================================================================
2378acc472SPeter Tyser */
2478acc472SPeter Tyser
25*51c2345bSPhilipp Tomsich #ifdef USE_HOSTCC
26*51c2345bSPhilipp Tomsich #include <arpa/inet.h>
27*51c2345bSPhilipp Tomsich #else
28*51c2345bSPhilipp Tomsich #include <common.h>
29*51c2345bSPhilipp Tomsich #endif
30a740ee91SPhilipp Tomsich #include <u-boot/crc.h>
3178acc472SPeter Tyser
3278acc472SPeter Tyser /* Table of CRC constants - implements x^16+x^12+x^5+1 */
3378acc472SPeter Tyser static const uint16_t crc16_tab[] = {
3478acc472SPeter Tyser 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
3578acc472SPeter Tyser 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
3678acc472SPeter Tyser 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
3778acc472SPeter Tyser 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
3878acc472SPeter Tyser 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
3978acc472SPeter Tyser 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
4078acc472SPeter Tyser 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
4178acc472SPeter Tyser 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
4278acc472SPeter Tyser 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
4378acc472SPeter Tyser 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
4478acc472SPeter Tyser 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
4578acc472SPeter Tyser 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
4678acc472SPeter Tyser 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
4778acc472SPeter Tyser 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
4878acc472SPeter Tyser 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
4978acc472SPeter Tyser 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
5078acc472SPeter Tyser 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
5178acc472SPeter Tyser 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
5278acc472SPeter Tyser 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
5378acc472SPeter Tyser 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
5478acc472SPeter Tyser 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
5578acc472SPeter Tyser 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
5678acc472SPeter Tyser 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
5778acc472SPeter Tyser 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
5878acc472SPeter Tyser 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
5978acc472SPeter Tyser 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
6078acc472SPeter Tyser 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
6178acc472SPeter Tyser 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
6278acc472SPeter Tyser 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
6378acc472SPeter Tyser 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
6478acc472SPeter Tyser 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
6578acc472SPeter Tyser 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
6678acc472SPeter Tyser };
6778acc472SPeter Tyser
crc16_ccitt(uint16_t cksum,const unsigned char * buf,int len)68*51c2345bSPhilipp Tomsich uint16_t crc16_ccitt(uint16_t cksum, const unsigned char *buf, int len)
6978acc472SPeter Tyser {
70*51c2345bSPhilipp Tomsich for (int i = 0; i < len; i++)
717109157fSStefan Roese cksum = crc16_tab[((cksum>>8) ^ *buf++) & 0xff] ^ (cksum << 8);
727109157fSStefan Roese
7378acc472SPeter Tyser return cksum;
7478acc472SPeter Tyser }
75*51c2345bSPhilipp Tomsich
crc16_ccitt_wd_buf(const uint8_t * in,uint len,uint8_t * out,uint chunk_sz)76*51c2345bSPhilipp Tomsich void crc16_ccitt_wd_buf(const uint8_t *in, uint len,
77*51c2345bSPhilipp Tomsich uint8_t *out, uint chunk_sz)
78*51c2345bSPhilipp Tomsich {
79*51c2345bSPhilipp Tomsich uint16_t crc;
80*51c2345bSPhilipp Tomsich
81*51c2345bSPhilipp Tomsich crc = crc16_ccitt(0, in, len);
82*51c2345bSPhilipp Tomsich crc = htons(crc);
83*51c2345bSPhilipp Tomsich memcpy(out, &crc, sizeof(crc));
84*51c2345bSPhilipp Tomsich }
85