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