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