From f76750e55b48340321c0305aaef68acf18c45e29 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 16:30:28 -0700 Subject: [PATCH] Add LFSR random number generator. Used for SD card write/read testing, maybe other stuff eventually? --- firmware/common/lfsr_random.cpp | 106 ++++++++++++++++++++++++++++++++ firmware/common/lfsr_random.hpp | 34 ++++++++++ 2 files changed, 140 insertions(+) create mode 100644 firmware/common/lfsr_random.cpp create mode 100644 firmware/common/lfsr_random.hpp diff --git a/firmware/common/lfsr_random.cpp b/firmware/common/lfsr_random.cpp new file mode 100644 index 000000000..ddeb044a1 --- /dev/null +++ b/firmware/common/lfsr_random.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "lfsr_random.hpp" + +static void lfsr_iterate_internal(lfsr_word_t& v) +{ + /* + Generated with lfsr-generator: + http://lfsr-generator.sourceforge.net + ============================================= + config : fibonacci + length : 31 + taps : (31, 18) + shift-amounts : (12, 12, 8) + shift-direction : left + */ + enum { + length = 31, + tap_0 = 31, + tap_1 = 18, + shift_amount_0 = 12, + shift_amount_1 = 12, + shift_amount_2 = 8 + }; + + const lfsr_word_t zero = 0; + v = ( + ( + v << shift_amount_0 + ) | ( + ( + (v >> (tap_0 - shift_amount_0)) ^ + (v >> (tap_1 - shift_amount_0)) + ) & ( + ~(~zero << shift_amount_0) + ) + ) + ); + v = ( + ( + v << shift_amount_1 + ) | ( + ( + (v >> (tap_0 - shift_amount_1)) ^ + (v >> (tap_1 - shift_amount_1)) + ) & ( + ~(~zero << shift_amount_1) + ) + ) + ); + v = ( + ( + v << shift_amount_2 + ) | ( + ( + (v >> (tap_0 - shift_amount_2)) ^ + (v >> (tap_1 - shift_amount_2)) + ) & ( + ~(~zero << shift_amount_2) + ) + ) + ); +} + +lfsr_word_t lfsr_iterate(lfsr_word_t v) { + lfsr_iterate_internal(v); + return v; +} + +void lfsr_fill(lfsr_word_t& v, lfsr_word_t* buffer, size_t word_count) { + while( word_count != 0 ) { + lfsr_iterate_internal(v); + *(buffer++) = v; + word_count--; + } +} + +bool lfsr_compare(lfsr_word_t& v, const lfsr_word_t* buffer, size_t word_count) { + while( word_count != 0 ) { + lfsr_iterate_internal(v); + if( *(buffer++) != v ) { + return false; + } + word_count--; + } + return true; +} diff --git a/firmware/common/lfsr_random.hpp b/firmware/common/lfsr_random.hpp new file mode 100644 index 000000000..0eaadc192 --- /dev/null +++ b/firmware/common/lfsr_random.hpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __LFSR_RANDOM_HPP__ +#define __LFSR_RANDOM_HPP__ + +#include +#include + +using lfsr_word_t = uint32_t; + +lfsr_word_t lfsr_iterate(lfsr_word_t v); +void lfsr_fill(lfsr_word_t& v, lfsr_word_t* buffer, size_t word_count); +bool lfsr_compare(lfsr_word_t& v, const lfsr_word_t* buffer, size_t word_count); + +#endif/*__LFSR_RANDOM_HPP__*/