From 3984bcade4784c451e8943fa2ef7e5821fc534db Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Tue, 9 Mar 2021 21:39:06 +1000 Subject: [PATCH] Adding CRC routines (to be used later to detect config corruption) --- src/firmware/crc.c | 37 +++++++++++++++++++++++++++++++++++++ src/firmware/crc.h | 24 ++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/firmware/crc.c create mode 100755 src/firmware/crc.h diff --git a/src/firmware/crc.c b/src/firmware/crc.c new file mode 100644 index 00000000..cc7278ef --- /dev/null +++ b/src/firmware/crc.c @@ -0,0 +1,37 @@ +// Copyright (C) 2020 Michael McMaster +// +// This file is part of SCSI2SD. +// +// SCSI2SD 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. +// +// SCSI2SD 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 SCSI2SD. If not, see . +#include "crc.h" + +// Use standard CRC-32 reversed poly +#define POLYNOMIAL 0xEDB88320 + +// Slow (but small) implementation that doesn't use lookup tables. +uint32_t s2s_crc32(uint8_t* data, int len) +{ + uint32_t crc = 0xFFFFFFFF; + for (int i = 0; i < len; ++i) + { + uint32_t byte = data[i]; + crc = crc ^ byte; + for (int j = 7; j >= 0; j--) + { + uint32_t mask = -(crc & 1); + crc = (crc >> 1) ^ (POLYNOMIAL & mask); + } + } + return ~crc; +} diff --git a/src/firmware/crc.h b/src/firmware/crc.h new file mode 100755 index 00000000..a363c279 --- /dev/null +++ b/src/firmware/crc.h @@ -0,0 +1,24 @@ +// Copyright (C) 2020 Michael McMaster +// +// This file is part of SCSI2SD. +// +// SCSI2SD 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. +// +// SCSI2SD 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 SCSI2SD. If not, see . +#ifndef S2S_CRC_H +#define S2S_CRC_H + +#include + +uint32_t s2s_crc32(uint8_t* data, int len); + +#endif -- 2.38.5