From 3538c51efb1738d3d7cabae145f14631350d7a72 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Tue, 7 Mar 2023 20:31:34 -0500 Subject: [PATCH] correct CRC-CCITT 162 used for NXDN CAC (inital CRC registers are set to 1); --- edac/CRC.cpp | 19 +++++++++---------- edac/CRC.h | 14 +++++++------- nxdn/channel/CAC.cpp | 2 +- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/edac/CRC.cpp b/edac/CRC.cpp index 6883052d..8ebefafc 100644 --- a/edac/CRC.cpp +++ b/edac/CRC.cpp @@ -228,7 +228,7 @@ void CRC::encodeFiveBit(const bool* in, uint32_t& tcrc) } /// -/// Check 16-bit CRC-CCITT. +/// Check 16-bit CRC CCITT-162. /// /// This uses polynomial 0x1021. /// Input byte array. @@ -260,7 +260,7 @@ bool CRC::checkCCITT162(const uint8_t *in, uint32_t length) } /// -/// Encode 16-bit CRC-CCITT. +/// Encode 16-bit CRC CCITT-162. /// /// This uses polynomial 0x1021. /// Input byte array. @@ -291,7 +291,7 @@ void CRC::addCCITT162(uint8_t* in, uint32_t length) } /// -/// Check 16-bit CRC-CCITT. +/// Check 16-bit CRC CCITT-161. /// /// This uses polynomial 0x1189. /// Input byte array. @@ -323,7 +323,7 @@ bool CRC::checkCCITT161(const uint8_t *in, uint32_t length) } /// -/// Encode 16-bit CRC-CCITT. +/// Encode 16-bit CRC CCITT-161. /// /// This uses polynomial 0x1189. /// Input byte array. @@ -654,7 +654,7 @@ uint16_t CRC::addCRC15(uint8_t* in, uint32_t bitLength) } /// -/// Check 16-bit CRC. +/// Check 16-bit CRC CCITT-162 w/ initial generator of 1. /// /// Input byte array. /// Length of byte array in bits. @@ -686,13 +686,13 @@ bool CRC::checkCRC16(const uint8_t* in, uint32_t bitLength) } /// -/// Encode 16-bit CRC. +/// Encode 16-bit CRC CCITT-162 w/ initial generator of 1. /// /// Input byte array. /// Length of byte array in bits. /// Offset in bits to write CRC. /// 16-bit CRC. -uint16_t CRC::addCRC16(uint8_t* in, uint32_t bitLength, uint32_t offset) +uint16_t CRC::addCRC16(uint8_t* in, uint32_t bitLength) { assert(in != nullptr); @@ -705,7 +705,7 @@ uint16_t CRC::addCRC16(uint8_t* in, uint32_t bitLength, uint32_t offset) uint32_t n = bitLength; for (uint32_t i = 0U; i < 16U; i++, n++) { bool b = READ_BIT(temp, i); - WRITE_BIT(in, n + offset, b); + WRITE_BIT(in, n, b); } #if DEBUG_CRC @@ -795,7 +795,7 @@ uint16_t CRC::createCRC15(const uint8_t* in, uint32_t bitLength) /// uint16_t CRC::createCRC16(const uint8_t* in, uint32_t bitLength) { - uint16_t crc = 0x0000U; + uint16_t crc = 0xFFFFU; for (uint32_t i = 0U; i < bitLength; i++) { bool bit1 = READ_BIT(in, i) != 0x00U; @@ -807,6 +807,5 @@ uint16_t CRC::createCRC16(const uint8_t* in, uint32_t bitLength) crc ^= 0x1021U; } - crc = ~crc; return crc & 0xFFFFU; } diff --git a/edac/CRC.h b/edac/CRC.h index 2c598f24..a62062bc 100644 --- a/edac/CRC.h +++ b/edac/CRC.h @@ -47,14 +47,14 @@ namespace edac /// Encode 5-bit CRC. static void encodeFiveBit(const bool* in, uint32_t& tcrc); - /// Check 16-bit CRC-CCITT. + /// Check 16-bit CRC CCITT-162. static bool checkCCITT162(const uint8_t* in, uint32_t length); - /// Encode 16-bit CRC-CCITT. + /// Encode 16-bit CRC CCITT-162. static void addCCITT162(uint8_t* in, uint32_t length); - /// Check 16-bit CRC-CCITT. + /// Check 16-bit CRC CCITT-161. static bool checkCCITT161(const uint8_t* in, uint32_t length); - /// Encode 16-bit CRC-CCITT. + /// Encode 16-bit CRC CCITT-161. static void addCCITT161(uint8_t* in, uint32_t length); /// Check 32-bit CRC. @@ -83,10 +83,10 @@ namespace edac /// Encode 15-bit CRC. static uint16_t addCRC15(uint8_t* in, uint32_t bitLength); - /// Check 16-bit CRC-CCITT. + /// Check 16-bit CRC CCITT-162 w/ initial generator of 1. static bool checkCRC16(const uint8_t* in, uint32_t bitLength); - /// Encode 16-bit CRC. - static uint16_t addCRC16(uint8_t* in, uint32_t bitLength, uint32_t offset = 0); + /// Encode 16-bit CRC CCITT-162 w/ initial generator of 1. + static uint16_t addCRC16(uint8_t* in, uint32_t bitLength); private: /// diff --git a/nxdn/channel/CAC.cpp b/nxdn/channel/CAC.cpp index ea8fd348..e611dce1 100644 --- a/nxdn/channel/CAC.cpp +++ b/nxdn/channel/CAC.cpp @@ -272,7 +272,7 @@ void CAC::encode(uint8_t* data) const WRITE_BIT(buffer, i, b); } - uint16_t crc = CRC::addCRC16(buffer, NXDN_CAC_LENGTH_BITS, 5U); + uint16_t crc = CRC::addCRC16(buffer, NXDN_CAC_LENGTH_BITS); #if DEBUG_NXDN_CAC Utils::dump(2U, "Encoded CAC", buffer, NXDN_CAC_FEC_LENGTH_BYTES);