From 16be5ef9ccff447e81873141a1d290675012d7a2 Mon Sep 17 00:00:00 2001 From: "Schoenberger, Philipp" Date: Thu, 28 Feb 2019 08:09:37 +0100 Subject: [PATCH] add eeprom definition --- Multiprotocol/Multiprotocol.ino | 5 +- Multiprotocol/eeprom.h | 81 +++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 Multiprotocol/eeprom.h diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 7bb1866..d1ea344 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -20,10 +20,7 @@ You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ -#if 0 -#include -#include -#endif + //#define DEBUG_PIN // Use pin TX for AVR and SPI_CS for STM32 => DEBUG_PIN_on, DEBUG_PIN_off, DEBUG_PIN_toggle #define DEBUG_SERIAL // Only for STM32_BOARD compiled with Upload method "Serial"->usart1, "STM32duino bootloader"->USB serial diff --git a/Multiprotocol/eeprom.h b/Multiprotocol/eeprom.h new file mode 100644 index 0000000..0a43387 --- /dev/null +++ b/Multiprotocol/eeprom.h @@ -0,0 +1,81 @@ +#ifndef _EEPROM_H_ +#define _EEPROM_H_ +#include + +#include +#include +#include "tx_def.h" + +#define CURRENT_VERSION 0x01 +struct eeprom_data_v1 { + uint8_t version; + uint32_t crc; + struct { + struct { + uint16_t max; + uint16_t min; + uint8_t inverted; + } throttle, yaw, roll, pitch, aux[5]; + uint32_t master_id; + } data; + +}; + + +const static uint32_t crc_table[16] = { + 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, + 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, + 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c +}; + +uint32_t crc_update (uint32_t crc, uint8_t data) +{ + uint8_t tbl_idx; + + tbl_idx = crc ^ (data >> (0 * 4)); + crc = (crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4); + + tbl_idx = crc ^ (data >> (1 * 4)); + crc = (crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4); + + return crc; +} + + +int read_eeprom(struct eeprom_data_v1 *eeprom_data) { + uint8_t *data = NULL; + uint8_t start_address = 0x10; + + EEPROM.PageBase0 = 0x801F000; + EEPROM.PageBase1 = 0x801F800; + EEPROM.PageSize = 0x400; + EEPROM.init(); + + data = (uint8_t*) eeprom_data; + + for (uint8_t i = 0; i < sizeof(eeprom_data) ; i = 0) { + EEPROM.read(0x10 + i , data); + data+=1; + } + + // validate version + if (eeprom_data->version != CURRENT_VERSION) { + return -1; + } + + + data = (uint8_t*) &(eeprom_data->data); + uint32_t crc = ~0L; + for (uint8_t i = 0; i < sizeof(eeprom_data->data) ; i = 0) { + crc = crc_update(crc, *data); + data+=1; + } + + // validate crc + if (eeprom_data->crc != crc) { + return -1; + } + +} +#endif