stm32f1xx EEPROM emulation (#3914)
* * Add stm32f1xx EEPROM emulation * Fix eeprom update compare bug Squashed commit of the following: commit b8f248ae08cec0cd81ecbb8854d9b39221d4d573 Author: hsgw <urkwtky@gmail.com> Date: Sat Sep 15 19:13:48 2018 +0900 fix EEPROM_update wrong compare commit d4ed4e6ea864e967a3e17f7edee4b0c3b4a25541 Author: hsgw <urkwtky@gmail.com> Date: Sat Sep 15 17:43:47 2018 +0900 eeprom fix initialization define commit b61aa7c04d70c64df3416d63e5da08b73b6053af Author: hsgw <urkwtky@gmail.com> Date: Sat Sep 15 16:33:40 2018 +0900 maybe working * Fix FLASH_KEY defines
This commit is contained in:
parent
8efe8b498d
commit
f4094930a3
7 changed files with 42 additions and 21 deletions
|
@ -34,6 +34,13 @@ ifeq ($(PLATFORM),CHIBIOS)
|
||||||
ifeq ($(MCU_SERIES), STM32F3xx)
|
ifeq ($(MCU_SERIES), STM32F3xx)
|
||||||
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
|
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
|
||||||
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
|
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
|
||||||
|
TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F303xC
|
||||||
|
TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE
|
||||||
|
else ifeq ($(MCU_SERIES), STM32F1xx)
|
||||||
|
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
|
||||||
|
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
|
||||||
|
TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F103xB
|
||||||
|
TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE
|
||||||
else
|
else
|
||||||
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c
|
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and
|
* This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and
|
||||||
* https://github.com/leaflabs/libmaple
|
* https://github.com/leaflabs/libmaple
|
||||||
*
|
*
|
||||||
* Modifications for QMK and STM32F303 by Yiancar
|
* Modifications for QMK and STM32F303 by Yiancar
|
||||||
|
@ -274,7 +274,7 @@ uint16_t EE_VerifyPageFullWriteVariable(uint16_t Address, uint16_t Data)
|
||||||
|
|
||||||
// Check each active page address starting from begining
|
// Check each active page address starting from begining
|
||||||
for (idx = pageBase + 4; idx < pageEnd; idx += 4)
|
for (idx = pageBase + 4; idx < pageEnd; idx += 4)
|
||||||
if ((*(__IO uint32_t*)idx) == 0xFFFFFFFF) // Verify if element
|
if ((*(__IO uint32_t*)idx) == 0xFFFFFFFF) // Verify if element
|
||||||
{ // contents are 0xFFFFFFFF
|
{ // contents are 0xFFFFFFFF
|
||||||
FlashStatus = FLASH_ProgramHalfWord(idx, Data); // Set variable data
|
FlashStatus = FLASH_ProgramHalfWord(idx, Data); // Set variable data
|
||||||
if (FlashStatus != FLASH_COMPLETE)
|
if (FlashStatus != FLASH_COMPLETE)
|
||||||
|
@ -517,7 +517,7 @@ uint16_t EEPROM_read(uint16_t Address, uint16_t *Data)
|
||||||
|
|
||||||
// Get the valid Page end Address
|
// Get the valid Page end Address
|
||||||
pageEnd = pageBase + ((uint32_t)(PageSize - 2));
|
pageEnd = pageBase + ((uint32_t)(PageSize - 2));
|
||||||
|
|
||||||
// Check each active page address starting from end
|
// Check each active page address starting from end
|
||||||
for (pageBase += 6; pageEnd >= pageBase; pageEnd -= 4)
|
for (pageBase += 6; pageEnd >= pageBase; pageEnd -= 4)
|
||||||
if ((*(__IO uint16_t*)pageEnd) == Address) // Compare the read address with the virtual address
|
if ((*(__IO uint16_t*)pageEnd) == Address) // Compare the read address with the virtual address
|
||||||
|
@ -574,7 +574,7 @@ uint16_t EEPROM_update(uint16_t Address, uint16_t Data)
|
||||||
{
|
{
|
||||||
uint16_t temp;
|
uint16_t temp;
|
||||||
EEPROM_read(Address, &temp);
|
EEPROM_read(Address, &temp);
|
||||||
if (Address == Data)
|
if (temp == Data)
|
||||||
return EEPROM_SAME_VALUE;
|
return EEPROM_SAME_VALUE;
|
||||||
else
|
else
|
||||||
return EEPROM_write(Address, Data);
|
return EEPROM_write(Address, Data);
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and
|
* This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and
|
||||||
* https://github.com/leaflabs/libmaple
|
* https://github.com/leaflabs/libmaple
|
||||||
*
|
*
|
||||||
* Modifications for QMK and STM32F303 by Yiancar
|
* Modifications for QMK and STM32F303 by Yiancar
|
||||||
|
@ -27,8 +27,14 @@
|
||||||
#include "flash_stm32.h"
|
#include "flash_stm32.h"
|
||||||
|
|
||||||
// HACK ALERT. This definition may not match your processor
|
// HACK ALERT. This definition may not match your processor
|
||||||
// To Do. Work out correct value for EEPROM_PAGE_SIZE on the STM32F103CT6 etc
|
// To Do. Work out correct value for EEPROM_PAGE_SIZE on the STM32F103CT6 etc
|
||||||
#define MCU_STM32F303CC
|
#if defined(EEPROM_EMU_STM32F303xC)
|
||||||
|
#define MCU_STM32F303CC
|
||||||
|
#elif defined(EEPROM_EMU_STM32F103xB)
|
||||||
|
#define MCU_STM32F103RB
|
||||||
|
#else
|
||||||
|
#error "not implemented."
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef EEPROM_PAGE_SIZE
|
#ifndef EEPROM_PAGE_SIZE
|
||||||
#if defined (MCU_STM32F103RB)
|
#if defined (MCU_STM32F103RB)
|
||||||
|
|
|
@ -10,19 +10,27 @@
|
||||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and
|
* This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and
|
||||||
* https://github.com/leaflabs/libmaple
|
* https://github.com/leaflabs/libmaple
|
||||||
*
|
*
|
||||||
* Modifications for QMK and STM32F303 by Yiancar
|
* Modifications for QMK and STM32F303 by Yiancar
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define STM32F303xC
|
#if defined(EEPROM_EMU_STM32F303xC)
|
||||||
|
#define STM32F303xC
|
||||||
|
#include "stm32f3xx.h"
|
||||||
|
#elif defined(EEPROM_EMU_STM32F103xB)
|
||||||
|
#define STM32F103xB
|
||||||
|
#include "stm32f1xx.h"
|
||||||
|
#else
|
||||||
|
#error "not implemented."
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "stm32f3xx.h"
|
|
||||||
#include "flash_stm32.h"
|
#include "flash_stm32.h"
|
||||||
|
|
||||||
#define FLASH_KEY1 ((uint32_t)0x45670123)
|
#if defined(EEPROM_EMU_STM32F103xB)
|
||||||
#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
|
#define FLASH_SR_WRPERR FLASH_SR_WRPRTERR
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Delay definition */
|
/* Delay definition */
|
||||||
#define EraseTimeout ((uint32_t)0x00000FFF)
|
#define EraseTimeout ((uint32_t)0x00000FFF)
|
||||||
|
@ -71,7 +79,7 @@ FLASH_Status FLASH_GetStatus(void)
|
||||||
* FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
|
* FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
|
||||||
*/
|
*/
|
||||||
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout)
|
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout)
|
||||||
{
|
{
|
||||||
FLASH_Status status;
|
FLASH_Status status;
|
||||||
|
|
||||||
/* Check for the Flash Status */
|
/* Check for the Flash Status */
|
||||||
|
@ -102,7 +110,7 @@ FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
|
||||||
ASSERT(IS_FLASH_ADDRESS(Page_Address));
|
ASSERT(IS_FLASH_ADDRESS(Page_Address));
|
||||||
/* Wait for last operation to be completed */
|
/* Wait for last operation to be completed */
|
||||||
status = FLASH_WaitForLastOperation(EraseTimeout);
|
status = FLASH_WaitForLastOperation(EraseTimeout);
|
||||||
|
|
||||||
if(status == FLASH_COMPLETE)
|
if(status == FLASH_COMPLETE)
|
||||||
{
|
{
|
||||||
/* if the previous operation is completed, proceed to erase the page */
|
/* if the previous operation is completed, proceed to erase the page */
|
||||||
|
@ -128,7 +136,7 @@ FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
|
||||||
* @param Address: specifies the address to be programmed.
|
* @param Address: specifies the address to be programmed.
|
||||||
* @param Data: specifies the data to be programmed.
|
* @param Data: specifies the data to be programmed.
|
||||||
* @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
|
* @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
|
||||||
* FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
|
* FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
|
||||||
*/
|
*/
|
||||||
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
|
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "eeconfig.h"
|
#include "eeconfig.h"
|
||||||
|
|
||||||
#ifdef STM32F303xC
|
#ifdef STM32_EEPROM_ENABLE
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
#include "eeprom_stm32.h"
|
#include "eeprom_stm32.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -32,7 +32,7 @@ void eeconfig_init_kb(void) {
|
||||||
* FIXME: needs doc
|
* FIXME: needs doc
|
||||||
*/
|
*/
|
||||||
void eeconfig_init_quantum(void) {
|
void eeconfig_init_quantum(void) {
|
||||||
#ifdef STM32F303xC
|
#ifdef STM32_EEPROM_ENABLE
|
||||||
EEPROM_format();
|
EEPROM_format();
|
||||||
#endif
|
#endif
|
||||||
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
|
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
|
||||||
|
@ -73,7 +73,7 @@ void eeconfig_enable(void)
|
||||||
*/
|
*/
|
||||||
void eeconfig_disable(void)
|
void eeconfig_disable(void)
|
||||||
{
|
{
|
||||||
#ifdef STM32F303xC
|
#ifdef STM32_EEPROM_ENABLE
|
||||||
EEPROM_format();
|
EEPROM_format();
|
||||||
#endif
|
#endif
|
||||||
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF);
|
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF);
|
||||||
|
|
|
@ -26,7 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF
|
#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF
|
||||||
|
|
||||||
/* eeprom parameteter address */
|
/* eeprom parameteter address */
|
||||||
#if !defined(STM32F303xC)
|
#if !defined(STM32_EEPROM_ENABLE)
|
||||||
#define EECONFIG_MAGIC (uint16_t *)0
|
#define EECONFIG_MAGIC (uint16_t *)0
|
||||||
#define EECONFIG_DEBUG (uint8_t *)2
|
#define EECONFIG_DEBUG (uint8_t *)2
|
||||||
#define EECONFIG_DEFAULT_LAYER (uint8_t *)3
|
#define EECONFIG_DEFAULT_LAYER (uint8_t *)3
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#ifdef MIDI_ENABLE
|
#ifdef MIDI_ENABLE
|
||||||
#include "qmk_midi.h"
|
#include "qmk_midi.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef STM32F303xC
|
#ifdef STM32_EEPROM_ENABLE
|
||||||
#include "eeprom_stm32.h"
|
#include "eeprom_stm32.h"
|
||||||
#endif
|
#endif
|
||||||
#include "suspend.h"
|
#include "suspend.h"
|
||||||
|
@ -112,7 +112,7 @@ int main(void) {
|
||||||
halInit();
|
halInit();
|
||||||
chSysInit();
|
chSysInit();
|
||||||
|
|
||||||
#ifdef STM32F303xC
|
#ifdef STM32_EEPROM_ENABLE
|
||||||
EEPROM_init();
|
EEPROM_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue