diff --git a/rpi/Makefile b/rpi/Makefile index 2d02902..2b477fd 100644 --- a/rpi/Makefile +++ b/rpi/Makefile @@ -10,7 +10,7 @@ endif # define all programs PROGRAM = spark_counter_receiver -SOURCES = ${PROGRAM:=.cpp} aes.c +SOURCES = ${PROGRAM:=.cpp} aes.c crc16.c all: ${PROGRAM} diff --git a/rpi/crc16.c b/rpi/crc16.c new file mode 100644 index 0000000..682d8b9 --- /dev/null +++ b/rpi/crc16.c @@ -0,0 +1,116 @@ +/* Copyright (c) 2002, 2003, 2004 Marek Michalkiewicz + Copyright (c) 2005, 2007 Joerg Wunsch + Copyright (c) 2013 Dave Hylands + Copyright (c) 2013 Frederic Nadeau + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +#include + +#define lo8(x) ((x)&0xff) +#define hi8(x) ((x)>>8) + +uint16_t crc16_update(uint16_t crc, uint8_t a) +{ +int i; + +crc ^= a; +for (i = 0; i < 8; ++i) +{ + if (crc & 1) + crc = (crc >> 1) ^ 0xA001; + else + crc = (crc >> 1); +} + +return crc; +} + +uint16_t crc_xmodem_update(uint16_t crc, uint8_t data) +{ + int i; + + crc = crc^((uint16_t)data<<8); + for (i=0; i<8; i++) + { + if (crc&0x8000) + crc = (crc << 1)^0x1021; + else + crc <<= 1; + } + + return crc; +} + +uint16_t crc_ccitt_update(uint16_t crc, uint8_t data) +{ + data ^= lo8(crc); + data ^= data<<4; + + return ((((uint16_t)data<<8)|hi8(crc))^(uint8_t)(data>>4) + ^ ((uint16_t)data<<3)); +} + +uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) +{ + uint8_t i; + + crc = crc^data; + for (i = 0; i<8; i++) + { + if (crc&0x01) + crc = (crc>>1)^0x8C; + else + crc >>= 1; + } + + return crc; +} + +uint8_t _crc8_ccitt_update(uint8_t inCrc, uint8_t inData) +{ + uint8_t i; + uint8_t data; + + data = inCrc^inData; + + for ( i = 0; i<8; i++ ) + { + if ((data & 0x80)!= 0) + { + data <<= 1; + data ^= 0x07; + } + else + { + data <<= 1; + } + } + return data; +} diff --git a/rpi/crc16.h b/rpi/crc16.h new file mode 100644 index 0000000..b7e291f --- /dev/null +++ b/rpi/crc16.h @@ -0,0 +1,110 @@ +/* Copyright (c) 2002, 2003, 2004 Marek Michalkiewicz + Copyright (c) 2005, 2007 Joerg Wunsch + Copyright (c) 2013 Dave Hylands + Copyright (c) 2013 Frederic Nadeau + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* $Id: crc16.h 2398 2013-05-08 11:45:54Z joerg_wunsch $ */ + +#ifndef _UTIL_CRC16_H_ +#define _UTIL_CRC16_H_ + +/* + This header file provides a optimized inline functions for calculating + cyclic redundancy checks (CRC) using common polynomials. +*/ + +/* + Optimized CRC-16 calculation. + + Polynomial: x^16 + x^15 + x^2 + 1 (0xa001)
+ Initial value: 0xffff + + This CRC is normally used in disk-drive controllers. +*/ +uint16_t crc16_update(uint16_t crc, uint8_t a); + +/* + Optimized CRC-XMODEM calculation. + + Polynomial: x^16 + x^12 + x^5 + 1 (0x1021)
+ Initial value: 0x0 + + This is the CRC used by the Xmodem-CRC protocol. +*/ +uint16_t crc_xmodem_update (uint16_t crc, uint8_t data); + +/* + Optimized CRC-CCITT calculation. + + Polynomial: x^16 + x^12 + x^5 + 1 (0x8408)
+ Initial value: 0xffff + + This is the CRC used by PPP and IrDA. + + See RFC1171 (PPP protocol) and IrDA IrLAP 1.1 + + \note Although the CCITT polynomial is the same as that used by the Xmodem + protocol, they are quite different. The difference is in how the bits are + shifted through the alorgithm. Xmodem shifts the MSB of the CRC and the + input first, while CCITT shifts the LSB of the CRC and the input first. +*/ +uint16_t crc_ccitt_update (uint16_t crc, uint8_t data); + +/* + Optimized Dallas (now Maxim) iButton 8-bit CRC calculation. + + Polynomial: x^8 + x^5 + x^4 + 1 (0x8C)
+ Initial value: 0x0 + + See http://www.maxim-ic.com/appnotes.cfm/appnote_number/27 +*/ +uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data); + +/* + Optimized CRC-8-CCITT calculation. + + Polynomial: x^8 + x^2 + x + 1 (0xE0)
+ + For use with simple CRC-8
+ Initial value: 0x0 + + For use with CRC-8-ROHC
+ Initial value: 0xff
+ Reference: http://tools.ietf.org/html/rfc3095#section-5.9.1 + + For use with CRC-8-ATM/ITU
+ Initial value: 0xff
+ Final XOR value: 0x55
+ Reference: http://www.itu.int/rec/T-REC-I.432.1-199902-I/en +*/ +uint8_t _crc8_ccitt_update (uint8_t inCrc, uint8_t inData); + +#endif /* _UTIL_CRC16_H_ */