*
* -->
*
- * \brief Cyclic Redundancy Check 16 (CRC).
+ * \brief Cyclic Redundancy Check 16 (CRC). This algorithm is the one used by the XMODEM protocol.
*
* \note This algorithm is incompatible with the CCITT-CRC16.
*
* to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
* Omen Technology.
*
- * \version $Id$
* \author Bernie Innocenti <bernie@codewiz.org>
*
* $WIZ$ module_name = "crc16"
#ifndef ALGO_CRC_H
#define ALGO_CRC_H
-#include <cfg/compiler.h>
+#include "cfg/cfg_arch.h"
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
+#include <cfg/compiler.h>
+#include <cpu/pgm.h>
+EXTERN_C_BEGIN
/* CRC table */
extern const uint16_t crc16tab[256];
* \param c New octet (range 0-255)
* \param oldcrc Previous CRC16 value (referenced twice, beware of side effects)
*/
-#define UPDCRC16(c, oldcrc) (crc16tab[((oldcrc) >> 8) ^ ((unsigned char)(c))] ^ ((oldcrc) << 8))
+#if CPU_HARVARD && !(defined(ARCH_BOOT) && (ARCH & ARCH_BOOT))
+ #define UPDCRC16(c, oldcrc) (pgm_read_uint16_t(&crc16tab[((oldcrc) >> 8) ^ ((unsigned char)(c))]) ^ ((oldcrc) << 8))
+#else
+ #define UPDCRC16(c, oldcrc) ((crc16tab[((oldcrc) >> 8) ^ ((unsigned char)(c))]) ^ ((oldcrc) << 8))
+#endif
+/** CRC-16 init value */
+#define CRC16_INIT_VAL ((uint16_t)0)
#ifdef INLINE
/**
- * \brief Compute the updated CRC16 value for one octet (macro version)
+ * \brief Compute the updated CRC16 value for one octet (inline version)
*/
INLINE uint16_t updcrc16(uint8_t c, uint16_t oldcrc)
{
+#if CPU_HARVARD && !(defined(ARCH_BOOT) && (ARCH & ARCH_BOOT))
+ return pgm_read_uint16_t(&crc16tab[(oldcrc >> 8) ^ c]) ^ (oldcrc << 8);
+#else
return crc16tab[(oldcrc >> 8) ^ c] ^ (oldcrc << 8);
+#endif
}
#endif // INLINE
*/
extern uint16_t crc16(uint16_t crc, const void *buf, size_t len);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+int crc_testSetup(void);
+int crc_testRun(void);
+int crc_testTearDown(void);
+
+EXTERN_C_END
#endif /* ALGO_CRC_H */