Refactor L4+ EFL sizing

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12920 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
cinsights 2019-07-20 13:35:48 +00:00
parent 81e586a948
commit f936eb20e3
2 changed files with 789 additions and 783 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,147 +1,159 @@
/* /*
ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/** /**
* @file hal_efl_lld.h * @file hal_efl_lld.h
* @brief STM32L4R/Snxx Embedded Flash subsystem low level driver header. * @brief STM32L4R/Snxx Embedded Flash subsystem low level driver header.
* *
* @addtogroup HAL_EFL * @addtogroup HAL_EFL
* @{ * @{
*/ */
#ifndef HAL_EFL_LLD_H #ifndef HAL_EFL_LLD_H
#define HAL_EFL_LLD_H #define HAL_EFL_LLD_H
#if (HAL_USE_EFL == TRUE) || defined(__DOXYGEN__) #if (HAL_USE_EFL == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/ /*===========================================================================*/
/* Driver constants. */ /* Driver constants. */
/*===========================================================================*/ /*===========================================================================*/
/*===========================================================================*/ /*===========================================================================*/
/* Driver pre-compile time settings. */ /* Driver pre-compile time settings. */
/*===========================================================================*/ /*===========================================================================*/
/** /**
* @name STM32L4xx configuration options * @name STM32L4xx configuration options
* @{ * @{
*/ */
/** /**
* @brief Suggested wait time during erase operations polling. * @brief Suggested wait time during erase operations polling.
*/ */
#if !defined(STM32_FLASH_WAIT_TIME_MS) || defined(__DOXYGEN__) #if !defined(STM32_FLASH_WAIT_TIME_MS) || defined(__DOXYGEN__)
#define STM32_FLASH_WAIT_TIME_MS 5 #define STM32_FLASH_WAIT_TIME_MS 5
#endif #endif
/** @} */ /** @} */
/*===========================================================================*/ /*===========================================================================*/
/* Derived constants and error checks. */ /* Derived constants and error checks. */
/*===========================================================================*/ /*===========================================================================*/
#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || \ #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || \
defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) || \ defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) || \
defined(__DOXYGEN__) defined(__DOXYGEN__)
/* /* Flash size register. */
* Flash size is: #define STM32_FLASH_SIZE_REGISTER 0x1FFF75E0
* 1M for STM32L4+ suffix G devices #define STM32_FLASH_SIZE_SCALE 1024U
* 2M for STM32L4+ suffix I devices.
* /*
* For 1M devices SBM is organised as 128 x 8K pages. * Device flash size is:
* For 1M devices DBM is organised as 128 x 4K pages per bank. * 1M for STM32L4+ suffix G devices
* * 2M for STM32L4+ suffix I devices.
* For 2M devices SBM is organised as 256 x 8K pages. *
* For 2M devices DBM is organised as 256 x 4K pages per bank. * For 1M devices SBM is organised as 128 x 8K pages.
*/ * For 1M devices DBM is organised as 128 x 4K pages per bank.
*
#define STM32_FLASH_SIZE_1M 1024U * For 2M devices SBM is organised as 256 x 8K pages.
#define STM32_FLASH_SIZE_2M 2048U * For 2M devices DBM is organised as 256 x 4K pages per bank.
*/
/* Single bank mode bank 1.*/
#define STM32_FLASH_SECTOR_SIZE 8192U #define STM32_FLASH_SIZE_1M 1024U
#define STM32_FLASH_SECTORS_PER_BANK 256 #define STM32_FLASH_SIZE_2M 2048U
#define STM32_FLASH_SECTORS_TOTAL_1M 128
/* Dual bank mode banks 1 & 2.*/ #define STM32_FLASH_SECTORS_TOTAL_2M 256
#define STM32_FLASH_DUAL_SECTOR_SIZE 4096U
#define STM32_FLASH_DUAL_SECTORS_PER_BANK 128 /* Single bank mode bank 1 for 1M device.*/
#define STM32_FLASH_SECTOR_SIZE_1M ((STM32_FLASH_SIZE_1M \
#define STM32_FLASH_SIZE_REGISTER 0x1FFF75E0 * STM32_FLASH_SIZE_SCALE) \
#else / STM32_FLASH_SECTORS_TOTAL_1M)
#error "This EFL driver does not support the selected device"
#endif /* Dual bank mode banks 1 & 2 for 1M device.*/
#define STM32_FLASH_DUAL_SECTOR_SIZE_1M (STM32_FLASH_SECTOR_SIZE_1M / 2)
/*===========================================================================*/
/* Driver data structures and types. */ /* Single bank mode bank 1 for 2M device.*/
/*===========================================================================*/ #define STM32_FLASH_SECTOR_SIZE_2M ((STM32_FLASH_SIZE_2M \
* STM32_FLASH_SIZE_SCALE) \
/* A flash size declaration. */ / STM32_FLASH_SECTORS_TOTAL_2M)
typedef struct {
uint16_t kb_size; /* Dual bank mode banks 1 & 2 for 2M device.*/
const flash_descriptor_t* desc; #define STM32_FLASH_DUAL_SECTOR_SIZE_2M (STM32_FLASH_SECTOR_SIZE_2M / 2)
} efl_lld_size_t;
#else
/*===========================================================================*/ #error "This EFL driver does not support the selected device"
/* Driver macros. */ #endif
/*===========================================================================*/
/*===========================================================================*/
/** /* Driver data structures and types. */
* @brief Low level fields of the embedded flash driver structure. /*===========================================================================*/
*/
#define efl_lld_driver_fields \ /* A flash size declaration. */
/* Flash registers.*/ \ typedef struct {
FLASH_TypeDef *flash; \ const flash_descriptor_t* desc;
const flash_descriptor_t *descriptor; } efl_lld_size_t;
/** /*===========================================================================*/
* @brief Low level fields of the embedded flash configuration structure. /* Driver macros. */
*/ /*===========================================================================*/
#define efl_lld_config_fields \
/* Dummy configuration, it is not needed.*/ \ /**
uint32_t dummy * @brief Low level fields of the embedded flash driver structure.
*/
/*===========================================================================*/ #define efl_lld_driver_fields \
/* External declarations. */ /* Flash registers.*/ \
/*===========================================================================*/ FLASH_TypeDef *flash; \
const flash_descriptor_t *descriptor;
#if !defined(__DOXYGEN__)
extern EFlashDriver EFLD1; /**
#endif * @brief Low level fields of the embedded flash configuration structure.
*/
#ifdef __cplusplus #define efl_lld_config_fields \
extern "C" { /* Dummy configuration, it is not needed.*/ \
#endif uint32_t dummy
void efl_lld_init(void);
void efl_lld_start(EFlashDriver *eflp); /*===========================================================================*/
void efl_lld_stop(EFlashDriver *eflp); /* External declarations. */
const flash_descriptor_t *efl_lld_get_descriptor(void *instance); /*===========================================================================*/
flash_error_t efl_lld_read(void *instance, flash_offset_t offset,
size_t n, uint8_t *rp); #if !defined(__DOXYGEN__)
flash_error_t efl_lld_program(void *instance, flash_offset_t offset, extern EFlashDriver EFLD1;
size_t n, const uint8_t *pp); #endif
flash_error_t efl_lld_start_erase_all(void *instance);
flash_error_t efl_lld_start_erase_sector(void *instance, #ifdef __cplusplus
flash_sector_t sector); extern "C" {
flash_error_t efl_lld_query_erase(void *instance, uint32_t *wait_time); #endif
flash_error_t efl_lld_verify_erase(void *instance, flash_sector_t sector); void efl_lld_init(void);
#ifdef __cplusplus void efl_lld_start(EFlashDriver *eflp);
} void efl_lld_stop(EFlashDriver *eflp);
#endif const flash_descriptor_t *efl_lld_get_descriptor(void *instance);
flash_error_t efl_lld_read(void *instance, flash_offset_t offset,
#endif /* HAL_USE_EFL == TRUE */ size_t n, uint8_t *rp);
flash_error_t efl_lld_program(void *instance, flash_offset_t offset,
#endif /* HAL_EFL_LLD_H */ size_t n, const uint8_t *pp);
flash_error_t efl_lld_start_erase_all(void *instance);
/** @} */ flash_error_t efl_lld_start_erase_sector(void *instance,
flash_sector_t sector);
flash_error_t efl_lld_query_erase(void *instance, uint32_t *wait_time);
flash_error_t efl_lld_verify_erase(void *instance, flash_sector_t sector);
#ifdef __cplusplus
}
#endif
#endif /* HAL_USE_EFL == TRUE */
#endif /* HAL_EFL_LLD_H */
/** @} */