Source code for the SX126xDVK1xAS Dev Kit. This example code has only been tested on the Nucleo L476RG

Dependencies:   mbed DmTftLibrary SX126xLib

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Eeprom.cpp Source File

Eeprom.cpp

00001 /*
00002   ______                              _
00003  / _____)             _              | |
00004 ( (____  _____ ____ _| |_ _____  ____| |__
00005  \____ \| ___ |    (_   _) ___ |/ ___)  _ \
00006  _____) ) ____| | | || |_| ____( (___| | | |
00007 (______/|_____)_|_|_| \__)_____)\____)_| |_|
00008     (C)2016 Semtech
00009 
00010 Description: EEPROM routines
00011 
00012 Maintainer: Gregory Cristian & Gilbert Menth
00013 */
00014 
00015 #include "mbed.h"
00016 #include "string.h"
00017 #include "Eeprom.h"
00018 #include "Menu.h"
00019 #include "DemoApplication.h"
00020 #include "sx126x.h"
00021 #if defined( TARGET_NUCLEO_L476RG )
00022 #include "stm32l4xx_hal_flash.h"
00023 #elif defined( TARGET_NUCLEO_L152RE )
00024 #include "stm32l1xx_hal_flash.h"
00025 #else
00026 #error "Please define include file"
00027 #endif
00028 
00029 
00030 
00031 #include "DisplayDriver.h"
00032 
00033 
00034 /*!
00035  * \brief Define address of Emulated EEPROM (in fact region of Flash)
00036  */
00037 #if defined( TARGET_NUCLEO_L476RG )
00038 #define DATA_EEPROM_BASE    ( ( uint32_t )0x0807F800U )
00039 #define DATA_EEPROM_END     ( ( uint32_t )DATA_EEPROM_BASE + 2048 )
00040 #elif defined( TARGET_NUCLEO_L152RE )
00041 #define DATA_EEPROM_BASE    ( ( uint32_t )0x08080000U ) 
00042 #define DATA_EEPROM_END     ( ( uint32_t )0x080807FFU )
00043 #else
00044 #error "Please define EEPROM base address and size for your board "
00045 #endif
00046 
00047 
00048 /*!
00049  * \brief CRC of EEPROM buffer and its valid status
00050  */
00051 typedef struct
00052 {
00053     uint16_t Value;
00054     bool Valid;
00055 }MemTestStruct_t;
00056 
00057 /*!
00058  * \brief Local copy of Eeprom.
00059  */
00060 Eeprom_t Eeprom;
00061 
00062 
00063 // Check CRC of local copy of Eeprom (Buffer). This update Valid & Value
00064 static MemTestStruct_t EepromDataCheckSum( void );
00065 uint8_t EepromMcuWriteBuffer( uint16_t addr, uint8_t *buffer, uint16_t size );
00066 
00067 void EepromInit( uint8_t deviceConnected, uint8_t matchingFreq )
00068 {
00069     MemTestStruct_t memTestStruct;
00070 
00071     EepromMcuReadBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE );
00072     EepromLoadGeneralSettings( );
00073 
00074     memTestStruct = EepromDataCheckSum( );
00075     if( !( memTestStruct.Valid ) || ( Eeprom.EepromData.DemoSettings.LastDeviceConnected != deviceConnected ) )
00076     {
00077 #ifdef ADV_DEBUG
00078         printf("EepromDataCheckSum failed\n\r");
00079 #endif
00080         EepromSetDefaultSettings( deviceConnected, matchingFreq );
00081     }
00082     EepromLoadSettings( ( RadioPacketTypes_t ) Eeprom.EepromData.DemoSettings.ModulationType );
00083 }
00084 
00085 void EepromSaveSettings( EepromDataSet_t dataSet)
00086 {
00087     MemTestStruct_t memTestStruct;
00088 
00089     switch( dataSet )
00090     {
00091         case RADIO_LORA_PARAMS:
00092             Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
00093             Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth       = ( RadioLoRaBandwidths_t )       Eeprom.EepromData.DemoSettings.ModulationParam2;
00094             Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate      = ( RadioLoRaCodingRates_t )      Eeprom.EepromData.DemoSettings.ModulationParam3;
00095 
00096             Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength      =                                 Eeprom.EepromData.DemoSettings.PacketParam1;
00097             Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType          = ( RadioLoRaPacketLengthsMode_t )Eeprom.EepromData.DemoSettings.PacketParam2;
00098             Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength       =                                 Eeprom.EepromData.DemoSettings.PacketParam3;
00099             Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode             = ( RadioLoRaCrcModes_t )         Eeprom.EepromData.DemoSettings.PacketParam4;
00100             Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ            = ( RadioLoRaIQModes_t )          Eeprom.EepromData.DemoSettings.PacketParam5;
00101 
00102             memcpy( Eeprom.Buffer + MOD_LORA_SPREADF_EEPROM_ADDR,      &( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor ), 1 );
00103             memcpy( Eeprom.Buffer + MOD_LORA_BW_EEPROM_ADDR,           &( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth ),       1 );
00104             memcpy( Eeprom.Buffer + MOD_LORA_CODERATE_EEPROM_ADDR,     &( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate ),      1 );
00105             memcpy( Eeprom.Buffer + PAK_LORA_PREAMBLE_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ),      1 );
00106             memcpy( Eeprom.Buffer + PAK_LORA_HEADERTYPE_EEPROM_ADDR,   &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ),          1 );
00107             memcpy( Eeprom.Buffer + PAK_LORA_PL_LEN_EEPROM_ADDR,       &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ),       1 );
00108             memcpy( Eeprom.Buffer + PAK_LORA_CRC_MODE_EEPROM_ADDR,     &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ),             1 );
00109             memcpy( Eeprom.Buffer + PAK_LORA_IQ_INV_EEPROM_ADDR,       &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ),            1 );
00110 #ifdef ADV_DEBUG
00111             printf("Saved RADIO_LoRa_PARAMS\n\r");
00112 #endif
00113             break;
00114 
00115         case RADIO_GFSK_PARAMS:
00116             Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate           =                             Eeprom.EepromData.DemoSettings.ModulationParam1;
00117             Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev              =                             Eeprom.EepromData.DemoSettings.ModulationParam2;
00118             Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping = ( RadioModShapings_t )      Eeprom.EepromData.DemoSettings.ModulationParam3;
00119             Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth         = ( RadioRxBandwidth_t )      Eeprom.EepromData.DemoSettings.ModulationParam4;
00120             Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength        =                             Eeprom.EepromData.DemoSettings.PacketParam1;
00121             Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect     = ( RadioPreambleDetection_t )Eeprom.EepromData.DemoSettings.PacketParam2;
00122             Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength        =                             Eeprom.EepromData.DemoSettings.PacketParam3;
00123             Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp              = ( RadioAddressComp_t )      Eeprom.EepromData.DemoSettings.PacketParam4;
00124             Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType            = ( RadioPacketLengthModes_t )Eeprom.EepromData.DemoSettings.PacketParam5;
00125             Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength         =                             Eeprom.EepromData.DemoSettings.PacketParam6;
00126 
00127             Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength             = ( RadioCrcTypes_t )         Eeprom.EepromData.DemoSettings.PacketParam7;
00128             Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree                = ( RadioDcFree_t )           Eeprom.EepromData.DemoSettings.PacketParam8;
00129 
00130             memcpy( Eeprom.Buffer + MOD_GFSK_BR_EEPROM_ADDR,           &( Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate ),           4 );
00131             memcpy( Eeprom.Buffer + MOD_GFSK_FDEV_EEPROM_ADDR,         &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev ),              4 );
00132             memcpy( Eeprom.Buffer + MOD_GFSK_MOD_SHAPE_EEPROM_ADDR,    &( Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping ), 1 );
00133             memcpy( Eeprom.Buffer + MOD_GFSK_BW_EEPROM_ADDR,           &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth ),         1 );
00134             memcpy( Eeprom.Buffer + PAK_GFSK_PREAMBLE_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength ),        1 );
00135             memcpy( Eeprom.Buffer + PAK_GFSK_PR_MIN_DET_EEPROM_ADDR,   &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect ),     1 );
00136             memcpy( Eeprom.Buffer + PAK_GFSK_SYNC_LEN_EEPROM_ADDR,     &( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength ),        1 );
00137             memcpy( Eeprom.Buffer + PAK_GFSK_HEADERTYPE_EEPROM_ADDR,   &( Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType ),            1 );
00138             memcpy( Eeprom.Buffer + PAK_GFSK_PL_LEN_EEPROM_ADDR,       &( Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength ),         1 );
00139             memcpy( Eeprom.Buffer + PAK_GFSK_ADDR_COMP_EEPROM_ADDR,    &( Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp ),              1 );
00140             memcpy( Eeprom.Buffer + PAK_GFSK_CRC_LEN_EEPROM_ADDR,      &( Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength ),             1 );
00141             memcpy( Eeprom.Buffer + PAK_GFSK_DC_FREE_EEPROM_ADDR,      &( Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree ),                1 );
00142             
00143 #ifdef ADV_DEBUG
00144             printf("Saved RADIO_GFSK_PARAMS\n\r");
00145 #endif
00146             break;
00147 
00148         case DEMO_SETTINGS:
00149             memcpy( Eeprom.Buffer + APP_ENTITY_EEPROM_ADDR,           &( Eeprom.EepromData.DemoSettings.Entity ),           1 );
00150             memcpy( Eeprom.Buffer + APP_RADIO_BOOSTED_RX_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.BoostedRx ),        1 );
00151             memcpy( Eeprom.Buffer + APP_FREQ_EEPROM_ADDR,             &( Eeprom.EepromData.DemoSettings.Frequency ),        4 );
00152             memcpy( Eeprom.Buffer + APP_TXPWR_EEPROM_ADDR,            &( Eeprom.EepromData.DemoSettings.TxPower ),          1 );
00153             memcpy( Eeprom.Buffer + APP_MOD_TYPE_EEPROM_ADDR,         &( Eeprom.EepromData.DemoSettings.ModulationType ),   1 );
00154             memcpy( Eeprom.Buffer + APP_PER_NPAK_MAX_EEPROM_ADDR,     &( Eeprom.EepromData.DemoSettings.MaxNumPacket ),     4 );
00155             memcpy( Eeprom.Buffer + APP_RADIO_POWER_MODE_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.RadioPowerMode ),   1 );
00156             memcpy( Eeprom.Buffer + MOD_PKET_TYPE_EEPROM_ADDR,        &( Eeprom.EepromData.DemoSettings.ModulationType ),  1 );
00157             memcpy( Eeprom.Buffer + PAK_PKET_TYPE_EEPROM_ADDR,        &( Eeprom.EepromData.DemoSettings.ModulationType ),  1 );
00158             memcpy( Eeprom.Buffer + EEPROM_LAST_DEVICE_CONNECTED,     &( Eeprom.EepromData.DemoSettings.LastDeviceConnected ),  1 );
00159 
00160 #ifdef ADV_DEBUG
00161             printf("Saved DEMO_SETTINGS\n\r");
00162 #endif
00163             break;
00164 
00165         case SCREEN_DATA:
00166             memcpy( Eeprom.Buffer + SCR_CAL_FLAG_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.ScreenCalibrated ), 1 );
00167             memcpy( Eeprom.Buffer + SCR_CAL_POSA_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.a ),    4 );
00168             memcpy( Eeprom.Buffer + SCR_CAL_POSB_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.b ),    4 );
00169             memcpy( Eeprom.Buffer + SCR_CAL_POSC_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.c ),    4 );
00170             memcpy( Eeprom.Buffer + SCR_CAL_POSD_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.d ),    4 );
00171             memcpy( Eeprom.Buffer + SCR_CAL_POSE_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.e ),    4 );
00172             memcpy( Eeprom.Buffer + SCR_CAL_POSF_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.f ),    4 );
00173             break;
00174 
00175         default:
00176 #ifdef ADV_DEBUG
00177             printf("data not saved\n\r");
00178 #endif
00179             break;
00180     }
00181 
00182     memTestStruct = EepromDataCheckSum( );
00183     memcpy( Eeprom.Buffer + EEPROM_CRC_EEPROM_ADDR, &( memTestStruct.Value ), 2 );
00184 
00185     EepromMcuWriteBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE );
00186 }
00187 
00188 void EepromLoadGeneralSettings( void )
00189 {
00190     printf("Load General Settings\n\r");
00191     memcpy( &( Eeprom.EepromData.MenuSettings.ScreenCalibrated ), Eeprom.Buffer + SCR_CAL_FLAG_EEPROM_ADDR, 1 );
00192     memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.a ),    Eeprom.Buffer + SCR_CAL_POSA_EEPROM_ADDR, 4 );
00193     memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.b ),    Eeprom.Buffer + SCR_CAL_POSB_EEPROM_ADDR, 4 );
00194     memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.c ),    Eeprom.Buffer + SCR_CAL_POSC_EEPROM_ADDR, 4 );
00195     memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.d ),    Eeprom.Buffer + SCR_CAL_POSD_EEPROM_ADDR, 4 );
00196     memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.e ),    Eeprom.Buffer + SCR_CAL_POSE_EEPROM_ADDR, 4 );
00197     memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.f ),    Eeprom.Buffer + SCR_CAL_POSF_EEPROM_ADDR, 4 );
00198 
00199     memcpy( &( Eeprom.EepromData.DemoSettings.Entity ),         Eeprom.Buffer + APP_ENTITY_EEPROM_ADDR,           1 );
00200     memcpy( &( Eeprom.EepromData.DemoSettings.BoostedRx ),      Eeprom.Buffer + APP_RADIO_BOOSTED_RX_EEPROM_ADDR, 1 ); 
00201     memcpy( &( Eeprom.EepromData.DemoSettings.Frequency ),      Eeprom.Buffer + APP_FREQ_EEPROM_ADDR,             4 );
00202     memcpy( &( Eeprom.EepromData.DemoSettings.RadioPowerMode ), Eeprom.Buffer + APP_RADIO_POWER_MODE_EEPROM_ADDR, 1 );
00203     memcpy( &( Eeprom.EepromData.DemoSettings.TxPower ),        Eeprom.Buffer + APP_TXPWR_EEPROM_ADDR,            1 );
00204     memcpy( &( Eeprom.EepromData.DemoSettings.ModulationType ), Eeprom.Buffer + APP_MOD_TYPE_EEPROM_ADDR,         1 );
00205     memcpy( &( Eeprom.EepromData.DemoSettings.MaxNumPacket ),   Eeprom.Buffer + APP_PER_NPAK_MAX_EEPROM_ADDR,     4 );
00206     memcpy( &( Eeprom.EepromData.DemoSettings.LastDeviceConnected ), Eeprom.Buffer + EEPROM_LAST_DEVICE_CONNECTED,         1 );
00207 
00208     memcpy( &( Eeprom.EepromData.ModulationParams.PacketType ),                    Eeprom.Buffer + MOD_PKET_TYPE_EEPROM_ADDR,      1 );
00209 
00210     memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate ),           Eeprom.Buffer + MOD_GFSK_BR_EEPROM_ADDR,        4 );
00211     memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev ),              Eeprom.Buffer + MOD_GFSK_FDEV_EEPROM_ADDR,      4 );
00212     memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping ), Eeprom.Buffer + MOD_GFSK_MOD_SHAPE_EEPROM_ADDR, 1 );
00213     memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth ),         Eeprom.Buffer + MOD_GFSK_BW_EEPROM_ADDR,        1 );
00214 
00215     memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor ),   Eeprom.Buffer + MOD_LORA_SPREADF_EEPROM_ADDR,   1 );
00216     memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth ),         Eeprom.Buffer + MOD_LORA_BW_EEPROM_ADDR,        1 );
00217     memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate ),        Eeprom.Buffer + MOD_LORA_CODERATE_EEPROM_ADDR,  1 );
00218 
00219     memcpy( &( Eeprom.EepromData.PacketParams.PacketType ),                    Eeprom.Buffer + PAK_PKET_TYPE_EEPROM_ADDR,         1 );
00220     memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength ),    Eeprom.Buffer + PAK_GFSK_PREAMBLE_LEN_EEPROM_ADDR, 1 );
00221     memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect ), Eeprom.Buffer + PAK_GFSK_PR_MIN_DET_EEPROM_ADDR,   1 );
00222     memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength ),    Eeprom.Buffer + PAK_GFSK_SYNC_LEN_EEPROM_ADDR,     1 );
00223     memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType ),        Eeprom.Buffer + PAK_GFSK_HEADERTYPE_EEPROM_ADDR,   1 );
00224     memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength ),     Eeprom.Buffer + PAK_GFSK_PL_LEN_EEPROM_ADDR,       1 );
00225     memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp ),          Eeprom.Buffer + PAK_GFSK_ADDR_COMP_EEPROM_ADDR,    1 );
00226     memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength ),         Eeprom.Buffer + PAK_GFSK_CRC_LEN_EEPROM_ADDR,      1 );
00227     memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree ),            Eeprom.Buffer + PAK_GFSK_DC_FREE_EEPROM_ADDR,      1 );
00228 
00229     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ),    Eeprom.Buffer + PAK_LORA_PREAMBLE_LEN_EEPROM_ADDR, 1 );
00230     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ),        Eeprom.Buffer + PAK_LORA_HEADERTYPE_EEPROM_ADDR,   1 );
00231     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ),     Eeprom.Buffer + PAK_LORA_PL_LEN_EEPROM_ADDR,       1 );
00232     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ),           Eeprom.Buffer + PAK_LORA_CRC_MODE_EEPROM_ADDR,     1 );
00233     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ),          Eeprom.Buffer + PAK_LORA_IQ_INV_EEPROM_ADDR,       1 );
00234 }
00235 
00236 void EepromLoadSettings( RadioPacketTypes_t modulation )
00237 {
00238     if( modulation == PACKET_TYPE_LORA )
00239     {
00240         printf("Load Settings PACKET_TYPE_LORA\n\r");
00241         memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_LORA_SPREADF_EEPROM_ADDR,      1 );
00242         memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth ),       Eeprom.Buffer + MOD_LORA_BW_EEPROM_ADDR,           1 );
00243         memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate ),      Eeprom.Buffer + MOD_LORA_CODERATE_EEPROM_ADDR,     1 );
00244         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ),      Eeprom.Buffer + PAK_LORA_PREAMBLE_LEN_EEPROM_ADDR, 1 );
00245         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ),          Eeprom.Buffer + PAK_LORA_HEADERTYPE_EEPROM_ADDR,   1 );
00246         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ),       Eeprom.Buffer + PAK_LORA_PL_LEN_EEPROM_ADDR,       1 );
00247         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ),             Eeprom.Buffer + PAK_LORA_CRC_MODE_EEPROM_ADDR,     1 );
00248         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ),            Eeprom.Buffer + PAK_LORA_IQ_INV_EEPROM_ADDR,       1 );
00249 
00250         Eeprom.EepromData.ModulationParams.PacketType   = PACKET_TYPE_LORA;
00251         Eeprom.EepromData.PacketParams.PacketType       = PACKET_TYPE_LORA;
00252         Eeprom.EepromData.DemoSettings.ModulationParam1 = Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor;
00253         Eeprom.EepromData.DemoSettings.ModulationParam2 = Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth;
00254         Eeprom.EepromData.DemoSettings.ModulationParam3 = Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate;
00255 
00256         Eeprom.EepromData.DemoSettings.PacketParam1 = Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength;
00257         Eeprom.EepromData.DemoSettings.PacketParam2 = Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType;
00258         Eeprom.EepromData.DemoSettings.PacketParam3 = Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength;
00259         Eeprom.EepromData.DemoSettings.PacketParam4 = Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode;
00260         Eeprom.EepromData.DemoSettings.PacketParam5 = Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ;
00261         Eeprom.EepromData.DemoSettings.PacketParam6 = 0x00;
00262         Eeprom.EepromData.DemoSettings.PacketParam7 = 0x00;
00263     }
00264     else// if( modulation == PACKET_TYPE_GFSK )
00265     {
00266         printf("Load Settings PACKET_TYPE_GFSK\n\r");
00267         memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate ),           Eeprom.Buffer + MOD_GFSK_BR_EEPROM_ADDR,           4 );
00268         memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev ),              Eeprom.Buffer + MOD_GFSK_FDEV_EEPROM_ADDR,         4 );
00269         memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping ), Eeprom.Buffer + MOD_GFSK_MOD_SHAPE_EEPROM_ADDR,    1 );
00270         memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth ),         Eeprom.Buffer + MOD_GFSK_BW_EEPROM_ADDR,           1 );
00271         
00272         memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength ),        Eeprom.Buffer + PAK_GFSK_PREAMBLE_LEN_EEPROM_ADDR, 1 );
00273         memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect ),     Eeprom.Buffer + PAK_GFSK_PR_MIN_DET_EEPROM_ADDR,   1 );
00274         memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength ),        Eeprom.Buffer + PAK_GFSK_SYNC_LEN_EEPROM_ADDR,     1 );
00275         memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType ),            Eeprom.Buffer + PAK_GFSK_HEADERTYPE_EEPROM_ADDR,   1 );
00276         memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength ),         Eeprom.Buffer + PAK_GFSK_PL_LEN_EEPROM_ADDR,       1 );
00277         memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp ),              Eeprom.Buffer + PAK_GFSK_ADDR_COMP_EEPROM_ADDR,    1 );
00278         memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength ),             Eeprom.Buffer + PAK_GFSK_CRC_LEN_EEPROM_ADDR,      1 );
00279         memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree ),                Eeprom.Buffer + PAK_GFSK_DC_FREE_EEPROM_ADDR,      1 );
00280 
00281         Eeprom.EepromData.ModulationParams.PacketType   = PACKET_TYPE_GFSK;
00282         Eeprom.EepromData.PacketParams.PacketType       = PACKET_TYPE_GFSK;
00283         Eeprom.EepromData.DemoSettings.ModulationParam1 = Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate;
00284         Eeprom.EepromData.DemoSettings.ModulationParam2 = Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev;
00285         Eeprom.EepromData.DemoSettings.ModulationParam3 = Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping;
00286         Eeprom.EepromData.DemoSettings.ModulationParam4 = Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth;
00287 
00288         Eeprom.EepromData.DemoSettings.PacketParam1 = Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength;
00289         Eeprom.EepromData.DemoSettings.PacketParam2 = Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect;
00290         Eeprom.EepromData.DemoSettings.PacketParam3 = Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength;
00291         Eeprom.EepromData.DemoSettings.PacketParam4 = Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp;
00292         Eeprom.EepromData.DemoSettings.PacketParam5 = Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType;
00293         Eeprom.EepromData.DemoSettings.PacketParam6 = Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength;
00294 
00295         Eeprom.EepromData.DemoSettings.PacketParam7 = Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength;
00296         Eeprom.EepromData.DemoSettings.PacketParam8 = Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree;
00297     }
00298 
00299     Eeprom.EepromData.DemoSettings.ModulationType = modulation;
00300 }
00301 
00302 void EepromSetDefaultSettings( uint8_t deviceConnected, uint8_t matchingFreq )
00303 {
00304     Eeprom.EepromData.MenuSettings.ScreenCalibrated = false;
00305 
00306     printf("Set Default Settings\n\r");
00307     EepromSaveSettings( SCREEN_DATA );
00308 
00309     Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_LORA;
00310     Eeprom.EepromData.ModulationParams.PacketType = PACKET_TYPE_LORA;
00311     Eeprom.EepromData.PacketParams.PacketType     = PACKET_TYPE_LORA;
00312 
00313     Eeprom.EepromData.DemoSettings.ModulationParam1 = LORA_SF7;
00314     
00315     if( deviceConnected == SX1268 )
00316     {
00317         if( matchingFreq == MATCHING_FREQ_780 )
00318         {
00319             Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_125;
00320         }
00321         else
00322         {
00323             Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_500;
00324         }
00325     }
00326     else
00327     {
00328         Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_500;
00329     }
00330     Eeprom.EepromData.DemoSettings.ModulationParam3 = LORA_CR_4_5;
00331     Eeprom.EepromData.DemoSettings.ModulationParam4 = 0x00;
00332 
00333     Eeprom.EepromData.DemoSettings.PacketParam1 = 8;        // PreambleLength
00334     Eeprom.EepromData.DemoSettings.PacketParam2 = LORA_PACKET_VARIABLE_LENGTH;
00335     Eeprom.EepromData.DemoSettings.PacketParam3 = 16;       // PayloadLength
00336     Eeprom.EepromData.DemoSettings.PacketParam4 = LORA_CRC_ON;
00337     Eeprom.EepromData.DemoSettings.PacketParam5 = LORA_IQ_NORMAL;
00338 
00339     EepromSaveSettings( RADIO_LORA_PARAMS );
00340 
00341     Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_GFSK;
00342     Eeprom.EepromData.ModulationParams.PacketType = PACKET_TYPE_GFSK;
00343     Eeprom.EepromData.PacketParams.PacketType     = PACKET_TYPE_GFSK;
00344 
00345     Eeprom.EepromData.DemoSettings.ModulationParam1 = 19200;
00346     Eeprom.EepromData.DemoSettings.ModulationParam2 = 5000;
00347     Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_1;
00348     Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_39000;
00349 
00350     Eeprom.EepromData.DemoSettings.PacketParam1 = 40;
00351     Eeprom.EepromData.DemoSettings.PacketParam2 = RADIO_PREAMBLE_DETECTOR_08_BITS;
00352     Eeprom.EepromData.DemoSettings.PacketParam3 = 4;
00353     Eeprom.EepromData.DemoSettings.PacketParam4 = RADIO_ADDRESSCOMP_FILT_OFF;
00354     Eeprom.EepromData.DemoSettings.PacketParam5 = RADIO_PACKET_VARIABLE_LENGTH;
00355     Eeprom.EepromData.DemoSettings.PacketParam6 = 16;           // PayloadLength
00356     Eeprom.EepromData.DemoSettings.PacketParam7 = RADIO_CRC_2_BYTES_CCIT;
00357     Eeprom.EepromData.DemoSettings.PacketParam8 = RADIO_DC_FREE_OFF;
00358 
00359     EepromSaveSettings( RADIO_GFSK_PARAMS );
00360 
00361     Eeprom.EepromData.DemoSettings.Entity         = SLAVE;
00362     Eeprom.EepromData.DemoSettings.BoostedRx      = true;
00363     if( deviceConnected == SX1261 )
00364     {
00365         Eeprom.EepromData.DemoSettings.LastDeviceConnected = deviceConnected;
00366         Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_DCDC;
00367         Eeprom.EepromData.DemoSettings.TxPower        = SX1261_POWER_TX_MAX;
00368     }
00369     else if( deviceConnected == SX1268 )
00370     {
00371         if( matchingFreq == MATCHING_FREQ_490 )
00372         {
00373             Eeprom.EepromData.DemoSettings.LastDeviceConnected = deviceConnected;
00374             Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_LDO;
00375             Eeprom.EepromData.DemoSettings.TxPower        = SX1262_POWER_TX_MAX;
00376         }
00377         else
00378         {
00379             Eeprom.EepromData.DemoSettings.LastDeviceConnected = deviceConnected;
00380             Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_DCDC;
00381             Eeprom.EepromData.DemoSettings.TxPower        = 10;
00382         }
00383     }
00384     else if( deviceConnected == SX1262 )
00385     {
00386         Eeprom.EepromData.DemoSettings.LastDeviceConnected = deviceConnected;
00387         Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_LDO;
00388         Eeprom.EepromData.DemoSettings.TxPower        = SX1262_POWER_TX_MAX;
00389     }
00390 
00391     if( matchingFreq == MATCHING_FREQ_169 )
00392     {
00393         Eeprom.EepromData.DemoSettings.Frequency      = DEMO_CENTRAL_FREQ_PRESET1;
00394     }
00395     else if( matchingFreq == MATCHING_FREQ_280 )
00396     {
00397         Eeprom.EepromData.DemoSettings.Frequency      = DEMO_CENTRAL_FREQ_PRESET2;
00398     }
00399     else if( matchingFreq == MATCHING_FREQ_434 )
00400     {
00401         Eeprom.EepromData.DemoSettings.Frequency      = DEMO_CENTRAL_FREQ_PRESET3;
00402     }
00403     else if( matchingFreq == MATCHING_FREQ_490 )
00404     {
00405         Eeprom.EepromData.DemoSettings.Frequency      = DEMO_CENTRAL_FREQ_PRESET4;
00406     }
00407     else if( matchingFreq == MATCHING_FREQ_780 )
00408     {
00409         Eeprom.EepromData.DemoSettings.Frequency      = DEMO_CENTRAL_FREQ_PRESET5;
00410     }
00411     else if( matchingFreq == MATCHING_FREQ_868 )
00412     {
00413         Eeprom.EepromData.DemoSettings.Frequency      = DEMO_CENTRAL_FREQ_PRESET6;
00414     }
00415     else if( matchingFreq == MATCHING_FREQ_915 )
00416     {
00417         Eeprom.EepromData.DemoSettings.Frequency      = DEMO_CENTRAL_FREQ_PRESET7;
00418     }
00419 
00420     Eeprom.EepromData.DemoSettings.MaxNumPacket   = 0x00;
00421     Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_LORA;
00422 
00423     EepromSaveSettings( DEMO_SETTINGS );
00424 }
00425 
00426 /*!
00427  * \brief Erase a page of Flash. Here used to Erase EEPROM region.
00428  *
00429  * \param [in]  page          address of page to erase
00430  * \param [in]  banks         address of banks to erase
00431  */
00432 void FlashPageErase( uint32_t page, uint32_t banks )
00433 {
00434     // Check the parameters
00435     assert_param( IS_FLASH_PAGE( page ) );
00436     assert_param( IS_FLASH_BANK_EXCLUSIVE( banks ) );
00437 
00438     if( ( banks & FLASH_BANK_1 ) != RESET )
00439     {
00440         CLEAR_BIT( FLASH->CR, FLASH_CR_BKER );
00441     }
00442     else
00443     {
00444         SET_BIT( FLASH->CR, FLASH_CR_BKER );
00445     }
00446 
00447     // Proceed to erase the page
00448     MODIFY_REG( FLASH->CR, FLASH_CR_PNB, ( page << 3 ) );
00449     SET_BIT( FLASH->CR, FLASH_CR_PER );
00450     SET_BIT( FLASH->CR, FLASH_CR_STRT );
00451 }
00452 
00453 /*!
00454  * \brief Write Eeprom to emulated EEPROM (in fact in Flash " higher address).
00455  *
00456  * \param [in]  addr          address of data (EEPROM offset not to be include)
00457  * \param [in]  buffer        buffer to use for copy
00458  * \param [in]  size          size of data to copy
00459  *
00460  * \retval      status        Status of operation (SUCCESS, ..)
00461  */
00462 uint8_t EepromMcuWriteBuffer( uint16_t addr, uint8_t *buffer, uint16_t size )
00463 {
00464     uint64_t *flash = ( uint64_t* )buffer;
00465     
00466     // assert_param( addr >= DATA_EEPROM_BASE );
00467     assert_param( buffer != NULL );
00468     assert_param( size < ( DATA_EEPROM_END - DATA_EEPROM_BASE ) );
00469 
00470     HAL_FLASH_Unlock( );
00471     
00472     FlashPageErase( 255, 1 );
00473     
00474     WRITE_REG( FLASH->CR, 0x40000000 );
00475 
00476     for( uint32_t i = 0; i < size; i++ )
00477     {
00478         HAL_FLASH_Program( FLASH_TYPEPROGRAM_DOUBLEWORD, DATA_EEPROM_BASE + \
00479                            ( 8 * i ), flash[i] );
00480     }
00481 
00482     HAL_FLASH_Lock( );
00483 
00484     return SUCCESS;
00485 }
00486 
00487 uint8_t EepromMcuReadBuffer( uint16_t addr, uint8_t *buffer, uint16_t size )
00488 {
00489     assert_param( buffer != NULL );
00490 
00491     // assert_param( addr >= DATA_EEPROM_BASE );
00492     assert_param( buffer != NULL );
00493     assert_param( size < ( DATA_EEPROM_END - DATA_EEPROM_BASE ) );
00494 
00495     memcpy( buffer, ( uint8_t* )DATA_EEPROM_BASE, size );
00496     return SUCCESS;
00497 }
00498 
00499 static MemTestStruct_t EepromDataCheckSum( void )
00500 {
00501     MemTestStruct_t memTestStruct;
00502     uint8_t x;
00503     uint8_t i;
00504     uint16_t crcBuf;
00505     memTestStruct.Value = 0xFFFF;
00506 
00507     for( i = 0; i < EEPROM_BUFFER_SIZE - sizeof( uint16_t ); i++ )
00508     {
00509         x = memTestStruct.Value >> 8 ^ Eeprom.Buffer[i];
00510         x ^= x >> 4;
00511         memTestStruct.Value = ( memTestStruct.Value << 8 ) ^ \
00512                               ( ( uint16_t )( x << 12 ) ) ^ \
00513                               ( ( uint16_t )( x << 5 ) ) ^ \
00514                               ( ( uint16_t )x );
00515     }
00516     memcpy( &crcBuf, Eeprom.Buffer + EEPROM_CRC_EEPROM_ADDR, 2 );
00517     memTestStruct.Valid = ( crcBuf == memTestStruct.Value );
00518 
00519     return memTestStruct;
00520 }
00521 
00522 void EepromEraseCheckSum( void )
00523 {
00524     memset( Eeprom.Buffer, 0, sizeof( Eeprom.Buffer ) );
00525     EepromMcuWriteBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE );
00526 }