Evgeniy Polyakov | 7657ec1 | 2005-08-17 15:17:26 +0400 | [diff] [blame^] | 1 | /* |
| 2 | * crc16.h - CRC-16 routine |
| 3 | * |
| 4 | * Implements the standard CRC-16, as used with 1-wire devices: |
| 5 | * Width 16 |
| 6 | * Poly 0x8005 (x^16 + x^15 + x^2 + 1) |
| 7 | * Init 0 |
| 8 | * |
| 9 | * For 1-wire devices, the CRC is stored inverted, LSB-first |
| 10 | * |
| 11 | * Example buffer with the CRC attached: |
| 12 | * 31 32 33 34 35 36 37 38 39 C2 44 |
| 13 | * |
| 14 | * The CRC over a buffer with the CRC attached is 0xB001. |
| 15 | * So, if (crc16(0, buf, size) == 0xB001) then the buffer is valid. |
| 16 | * |
| 17 | * Refer to "Application Note 937: Book of iButton Standards" for details. |
| 18 | * http://www.maxim-ic.com/appnotes.cfm/appnote_number/937 |
| 19 | * |
| 20 | * Copyright (c) 2005 Ben Gardner <bgardner@wabtec.com> |
| 21 | * |
| 22 | * This source code is licensed under the GNU General Public License, |
| 23 | * Version 2. See the file COPYING for more details. |
| 24 | */ |
| 25 | |
| 26 | #ifndef __CRC16_H |
| 27 | #define __CRC16_H |
| 28 | |
| 29 | #include <linux/types.h> |
| 30 | |
| 31 | #define CRC16_INIT 0 |
| 32 | #define CRC16_VALID 0xb001 |
| 33 | |
| 34 | extern u16 const crc16_table[256]; |
| 35 | |
| 36 | extern u16 crc16(u16 crc, const u8 *buffer, size_t len); |
| 37 | |
| 38 | static inline u16 crc16_byte(u16 crc, const u8 data) |
| 39 | { |
| 40 | return (crc >> 8) ^ crc16_table[(crc ^ data) & 0xff]; |
| 41 | } |
| 42 | |
| 43 | #endif /* __CRC16_H */ |
| 44 | |