From 052580df3a7e8ec75eaecedbb4d4a082df179194 Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Sat, 5 Mar 2022 11:08:31 +0100 Subject: [PATCH] Implementation of CCITT CRC16 --- meson.build | 1 + openrtx/include/core/crc.h | 44 ++++++++++++++++++++++++++++++++++++++ openrtx/src/core/crc.c | 37 ++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 openrtx/include/core/crc.h create mode 100644 openrtx/src/core/crc.c diff --git a/meson.build b/meson.build index 3e0b8e04..d527a193 100644 --- a/meson.build +++ b/meson.build @@ -30,6 +30,7 @@ openrtx_src = ['openrtx/src/core/state.c', 'openrtx/src/core/gps.c', 'openrtx/src/core/dsp.cpp', 'openrtx/src/core/cps.c', + 'openrtx/src/core/crc.c', 'openrtx/src/core/memory_profiling.cpp', 'openrtx/src/ui/ui.c', 'openrtx/src/ui/ui_main.c', diff --git a/openrtx/include/core/crc.h b/openrtx/include/core/crc.h new file mode 100644 index 00000000..913defed --- /dev/null +++ b/openrtx/include/core/crc.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * Copyright (C) 2022 by Federico Amedeo Izzo IU2NUO, * + * Niccolò Izzo IU2KIN * + * Frederik Saraci IU2NRO * + * Silvano Seva IU2KWO * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see * + ***************************************************************************/ + +#ifndef CRC_H +#define CRC_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Compute the CCITT 16-bit CRC over a given block of data. + * + * @param data: input data. + * @param len: data length, in bytes. + * @return CCITT CRC. + */ +uint16_t crc_ccitt(const void *data, const size_t len); + +#ifdef __cplusplus +} +#endif + +#endif /* CRC_H */ diff --git a/openrtx/src/core/crc.c b/openrtx/src/core/crc.c new file mode 100644 index 00000000..9a66cba3 --- /dev/null +++ b/openrtx/src/core/crc.c @@ -0,0 +1,37 @@ +/*************************************************************************** + * Copyright (C) 2022 by Federico Amedeo Izzo IU2NUO, * + * Niccolò Izzo IU2KIN * + * Frederik Saraci IU2NRO * + * Silvano Seva IU2KWO * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see * + ***************************************************************************/ + +#include + +uint16_t crc_ccitt(const void *data, const size_t len) +{ + uint16_t x = 0; + uint16_t crc = 0; + const uint8_t *buf = ((const uint8_t *) data); + + for(size_t i = 0; i < len; i++) + { + x = (crc >> 8) ^ buf[i]; + x ^= x >> 4; + crc = (crc << 8) ^ (x << 12) ^ (x << 5) ^ x; + } + + return crc; +}