// SPDX-License-Identifier: GPL-2.0-only
/*
* crc16.c
*/
#include <linux/crc16.h>
#include <linux/export.h>
#include <linux/module.h>
#include <linux/types.h>
/** CRC table for the CRC-16. The poly is 0x8005 (x^16 + x^15 + x^2 + 1) */
static const u16 crc16_table[256 ] = {
0 x0000, 0 xC0C1, 0 xC181, 0 x0140, 0 xC301, 0 x03C0, 0 x0280, 0 xC241,
0 xC601, 0 x06C0, 0 x0780, 0 xC741, 0 x0500, 0 xC5C1, 0 xC481, 0 x0440,
0 xCC01, 0 x0CC0, 0 x0D80, 0 xCD41, 0 x0F00, 0 xCFC1, 0 xCE81, 0 x0E40,
0 x0A00, 0 xCAC1, 0 xCB81, 0 x0B40, 0 xC901, 0 x09C0, 0 x0880, 0 xC841,
0 xD801, 0 x18C0, 0 x1980, 0 xD941, 0 x1B00, 0 xDBC1, 0 xDA81, 0 x1A40,
0 x1E00, 0 xDEC1, 0 xDF81, 0 x1F40, 0 xDD01, 0 x1DC0, 0 x1C80, 0 xDC41,
0 x1400, 0 xD4C1, 0 xD581, 0 x1540, 0 xD701, 0 x17C0, 0 x1680, 0 xD641,
0 xD201, 0 x12C0, 0 x1380, 0 xD341, 0 x1100, 0 xD1C1, 0 xD081, 0 x1040,
0 xF001, 0 x30C0, 0 x3180, 0 xF141, 0 x3300, 0 xF3C1, 0 xF281, 0 x3240,
0 x3600, 0 xF6C1, 0 xF781, 0 x3740, 0 xF501, 0 x35C0, 0 x3480, 0 xF441,
0 x3C00, 0 xFCC1, 0 xFD81, 0 x3D40, 0 xFF01, 0 x3FC0, 0 x3E80, 0 xFE41,
0 xFA01, 0 x3AC0, 0 x3B80, 0 xFB41, 0 x3900, 0 xF9C1, 0 xF881, 0 x3840,
0 x2800, 0 xE8C1, 0 xE981, 0 x2940, 0 xEB01, 0 x2BC0, 0 x2A80, 0 xEA41,
0 xEE01, 0 x2EC0, 0 x2F80, 0 xEF41, 0 x2D00, 0 xEDC1, 0 xEC81, 0 x2C40,
0 xE401, 0 x24C0, 0 x2580, 0 xE541, 0 x2700, 0 xE7C1, 0 xE681, 0 x2640,
0 x2200, 0 xE2C1, 0 xE381, 0 x2340, 0 xE101, 0 x21C0, 0 x2080, 0 xE041,
0 xA001, 0 x60C0, 0 x6180, 0 xA141, 0 x6300, 0 xA3C1, 0 xA281, 0 x6240,
0 x6600, 0 xA6C1, 0 xA781, 0 x6740, 0 xA501, 0 x65C0, 0 x6480, 0 xA441,
0 x6C00, 0 xACC1, 0 xAD81, 0 x6D40, 0 xAF01, 0 x6FC0, 0 x6E80, 0 xAE41,
0 xAA01, 0 x6AC0, 0 x6B80, 0 xAB41, 0 x6900, 0 xA9C1, 0 xA881, 0 x6840,
0 x7800, 0 xB8C1, 0 xB981, 0 x7940, 0 xBB01, 0 x7BC0, 0 x7A80, 0 xBA41,
0 xBE01, 0 x7EC0, 0 x7F80, 0 xBF41, 0 x7D00, 0 xBDC1, 0 xBC81, 0 x7C40,
0 xB401, 0 x74C0, 0 x7580, 0 xB541, 0 x7700, 0 xB7C1, 0 xB681, 0 x7640,
0 x7200, 0 xB2C1, 0 xB381, 0 x7340, 0 xB101, 0 x71C0, 0 x7080, 0 xB041,
0 x5000, 0 x90C1, 0 x9181, 0 x5140, 0 x9301, 0 x53C0, 0 x5280, 0 x9241,
0 x9601, 0 x56C0, 0 x5780, 0 x9741, 0 x5500, 0 x95C1, 0 x9481, 0 x5440,
0 x9C01, 0 x5CC0, 0 x5D80, 0 x9D41, 0 x5F00, 0 x9FC1, 0 x9E81, 0 x5E40,
0 x5A00, 0 x9AC1, 0 x9B81, 0 x5B40, 0 x9901, 0 x59C0, 0 x5880, 0 x9841,
0 x8801, 0 x48C0, 0 x4980, 0 x8941, 0 x4B00, 0 x8BC1, 0 x8A81, 0 x4A40,
0 x4E00, 0 x8EC1, 0 x8F81, 0 x4F40, 0 x8D01, 0 x4DC0, 0 x4C80, 0 x8C41,
0 x4400, 0 x84C1, 0 x8581, 0 x4540, 0 x8701, 0 x47C0, 0 x4680, 0 x8641,
0 x8201, 0 x42C0, 0 x4380, 0 x8341, 0 x4100, 0 x81C1, 0 x8081, 0 x4040
};
/**
* crc16 - compute the CRC-16 for the data buffer
* @crc: previous CRC value
* @p: data pointer
* @len: number of bytes in the buffer
*
* Returns the updated CRC value.
*/
u16 crc16(u16 crc, const u8 *p, size_t len)
{
while (len--)
crc = (crc >> 8 ) ^ crc16_table[(crc & 0 xff) ^ *p++];
return crc;
}
EXPORT_SYMBOL(crc16);
MODULE_DESCRIPTION("CRC16 calculations" );
MODULE_LICENSE("GPL" );
Messung V0.5 in Prozent C=95 H=60 G=79