[FL-3280] cubewb: downgraded to v1.15.0 (#2605)

* cubewb: downgraded to v1.15.0
* hal: updated f18 symbols to match LL
* hal: flash: use furi_hal_cortex_timer for timeouts
* scripts: fixed cube version validation from config file
* hal: flash: added 3 seconds timeout when waiting for C2 to unlock flash controller. On timeout, triggers furi_check
* nfc: fixed missing interrupt setup on multiple platformSetIrqCallback() invocations
* hal: gpio: don't trigger furi_check on furi_hal_gpio_add_int_callback() with same parameters
* Reverted NFC fixes - will be in a separate PR
* scripts: storage: fixed exception handler for paths
This commit is contained in:
hedger 2023-04-24 11:19:36 +04:00 committed by GitHub
parent 4d015a1106
commit 1ef70c0bb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 35 additions and 23 deletions

View File

@ -20,7 +20,7 @@ DIST_SUFFIX = "local"
COPRO_OB_DATA = "scripts/ob.data" COPRO_OB_DATA = "scripts/ob.data"
# Must match lib/STM32CubeWB version # Must match lib/STM32CubeWB version
COPRO_CUBE_VERSION = "1.16.0" COPRO_CUBE_VERSION = "1.15.0"
COPRO_CUBE_DIR = "lib/STM32CubeWB" COPRO_CUBE_DIR = "lib/STM32CubeWB"

View File

@ -199,8 +199,8 @@ Function,-,LL_EXTI_StructInit,void,LL_EXTI_InitTypeDef*
Function,-,LL_GPIO_DeInit,ErrorStatus,GPIO_TypeDef* Function,-,LL_GPIO_DeInit,ErrorStatus,GPIO_TypeDef*
Function,+,LL_GPIO_Init,ErrorStatus,"GPIO_TypeDef*, LL_GPIO_InitTypeDef*" Function,+,LL_GPIO_Init,ErrorStatus,"GPIO_TypeDef*, LL_GPIO_InitTypeDef*"
Function,-,LL_GPIO_StructInit,void,LL_GPIO_InitTypeDef* Function,-,LL_GPIO_StructInit,void,LL_GPIO_InitTypeDef*
Function,-,LL_I2C_DeInit,ErrorStatus,const I2C_TypeDef* Function,-,LL_I2C_DeInit,ErrorStatus,I2C_TypeDef*
Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, const LL_I2C_InitTypeDef*" Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, LL_I2C_InitTypeDef*"
Function,-,LL_I2C_StructInit,void,LL_I2C_InitTypeDef* Function,-,LL_I2C_StructInit,void,LL_I2C_InitTypeDef*
Function,-,LL_Init1msTick,void,uint32_t Function,-,LL_Init1msTick,void,uint32_t
Function,+,LL_LPTIM_DeInit,ErrorStatus,LPTIM_TypeDef* Function,+,LL_LPTIM_DeInit,ErrorStatus,LPTIM_TypeDef*

1 entry status name type params
199 Function - LL_GPIO_DeInit ErrorStatus GPIO_TypeDef*
200 Function + LL_GPIO_Init ErrorStatus GPIO_TypeDef*, LL_GPIO_InitTypeDef*
201 Function - LL_GPIO_StructInit void LL_GPIO_InitTypeDef*
202 Function - LL_I2C_DeInit ErrorStatus const I2C_TypeDef* I2C_TypeDef*
203 Function + LL_I2C_Init ErrorStatus I2C_TypeDef*, const LL_I2C_InitTypeDef* I2C_TypeDef*, LL_I2C_InitTypeDef*
204 Function - LL_I2C_StructInit void LL_I2C_InitTypeDef*
205 Function - LL_Init1msTick void uint32_t
206 Function + LL_LPTIM_DeInit ErrorStatus LPTIM_TypeDef*

View File

@ -231,8 +231,8 @@ Function,-,LL_EXTI_StructInit,void,LL_EXTI_InitTypeDef*
Function,-,LL_GPIO_DeInit,ErrorStatus,GPIO_TypeDef* Function,-,LL_GPIO_DeInit,ErrorStatus,GPIO_TypeDef*
Function,+,LL_GPIO_Init,ErrorStatus,"GPIO_TypeDef*, LL_GPIO_InitTypeDef*" Function,+,LL_GPIO_Init,ErrorStatus,"GPIO_TypeDef*, LL_GPIO_InitTypeDef*"
Function,-,LL_GPIO_StructInit,void,LL_GPIO_InitTypeDef* Function,-,LL_GPIO_StructInit,void,LL_GPIO_InitTypeDef*
Function,-,LL_I2C_DeInit,ErrorStatus,const I2C_TypeDef* Function,-,LL_I2C_DeInit,ErrorStatus,I2C_TypeDef*
Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, const LL_I2C_InitTypeDef*" Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, LL_I2C_InitTypeDef*"
Function,-,LL_I2C_StructInit,void,LL_I2C_InitTypeDef* Function,-,LL_I2C_StructInit,void,LL_I2C_InitTypeDef*
Function,-,LL_Init1msTick,void,uint32_t Function,-,LL_Init1msTick,void,uint32_t
Function,+,LL_LPTIM_DeInit,ErrorStatus,LPTIM_TypeDef* Function,+,LL_LPTIM_DeInit,ErrorStatus,LPTIM_TypeDef*

1 entry status name type params
231 Function - LL_GPIO_DeInit ErrorStatus GPIO_TypeDef*
232 Function + LL_GPIO_Init ErrorStatus GPIO_TypeDef*, LL_GPIO_InitTypeDef*
233 Function - LL_GPIO_StructInit void LL_GPIO_InitTypeDef*
234 Function - LL_I2C_DeInit ErrorStatus const I2C_TypeDef* I2C_TypeDef*
235 Function + LL_I2C_Init ErrorStatus I2C_TypeDef*, const LL_I2C_InitTypeDef* I2C_TypeDef*, LL_I2C_InitTypeDef*
236 Function - LL_I2C_StructInit void LL_I2C_InitTypeDef*
237 Function - LL_Init1msTick void uint32_t
238 Function + LL_LPTIM_DeInit ErrorStatus LPTIM_TypeDef*

View File

@ -18,8 +18,8 @@ PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t ble_app_cmd_buffer;
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint32_t ble_app_nvm[BLE_NVM_SRAM_SIZE]; PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint32_t ble_app_nvm[BLE_NVM_SRAM_SIZE];
_Static_assert( _Static_assert(
sizeof(SHCI_C2_Ble_Init_Cmd_Packet_t) == 58, sizeof(SHCI_C2_Ble_Init_Cmd_Packet_t) == 57,
"Ble stack config structure size mismatch (check new config options - last updated for v.1.16.0)"); "Ble stack config structure size mismatch (check new config options - last updated for v.1.15.0)");
typedef struct { typedef struct {
FuriMutex* hci_mtx; FuriMutex* hci_mtx;

View File

@ -1,6 +1,7 @@
#include <furi_hal_flash.h> #include <furi_hal_flash.h>
#include <furi_hal_bt.h> #include <furi_hal_bt.h>
#include <furi_hal_power.h> #include <furi_hal_power.h>
#include <furi_hal_cortex.h>
#include <furi.h> #include <furi.h>
#include <ble/ble.h> #include <ble/ble.h>
#include <interface/patterns/ble_thread/shci/shci.h> #include <interface/patterns/ble_thread/shci/shci.h>
@ -26,6 +27,16 @@
#define FURI_HAL_FLASH_OPT_KEY2 0x4C5D6E7F #define FURI_HAL_FLASH_OPT_KEY2 0x4C5D6E7F
#define FURI_HAL_FLASH_OB_TOTAL_WORDS (0x80 / (sizeof(uint32_t) * 2)) #define FURI_HAL_FLASH_OB_TOTAL_WORDS (0x80 / (sizeof(uint32_t) * 2))
/* lib/STM32CubeWB/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/flash_driver.c
* ProcessSingleFlashOperation, quote:
> In most BLE application, the flash should not be blocked by the CPU2 longer than FLASH_TIMEOUT_VALUE (1000ms)
> However, it could be that for some marginal application, this time is longer.
> ... there is no other way than waiting the operation to be completed.
> If for any reason this test is never passed, this means there is a failure in the system and there is no other
> way to recover than applying a device reset.
*/
#define FURI_HAL_FLASH_C2_LOCK_TIMEOUT_MS 3000u /* 3 seconds */
#define IS_ADDR_ALIGNED_64BITS(__VALUE__) (((__VALUE__)&0x7U) == (0x00UL)) #define IS_ADDR_ALIGNED_64BITS(__VALUE__) (((__VALUE__)&0x7U) == (0x00UL))
#define IS_FLASH_PROGRAM_ADDRESS(__VALUE__) \ #define IS_FLASH_PROGRAM_ADDRESS(__VALUE__) \
(((__VALUE__) >= FLASH_BASE) && ((__VALUE__) <= (FLASH_BASE + FLASH_SIZE - 8UL)) && \ (((__VALUE__) >= FLASH_BASE) && ((__VALUE__) <= (FLASH_BASE + FLASH_SIZE - 8UL)) && \
@ -131,9 +142,11 @@ static void furi_hal_flash_begin_with_core2(bool erase_flag) {
for(volatile uint32_t i = 0; i < 35; i++) for(volatile uint32_t i = 0; i < 35; i++)
; ;
FuriHalCortexTimer timer = furi_hal_cortex_timer_get(FURI_HAL_FLASH_C2_LOCK_TIMEOUT_MS * 1000);
while(true) { while(true) {
/* Wait till flash controller become usable */ /* Wait till flash controller become usable */
while(LL_FLASH_IsActiveFlag_OperationSuspended()) { while(LL_FLASH_IsActiveFlag_OperationSuspended()) {
furi_check(!furi_hal_cortex_timer_is_expired(timer));
furi_thread_yield(); furi_thread_yield();
}; };
@ -143,6 +156,7 @@ static void furi_hal_flash_begin_with_core2(bool erase_flag) {
/* Actually we already have mutex for it, but specification is specification */ /* Actually we already have mutex for it, but specification is specification */
if(LL_HSEM_IsSemaphoreLocked(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID)) { if(LL_HSEM_IsSemaphoreLocked(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID)) {
taskEXIT_CRITICAL(); taskEXIT_CRITICAL();
furi_check(!furi_hal_cortex_timer_is_expired(timer));
furi_thread_yield(); furi_thread_yield();
continue; continue;
} }
@ -150,6 +164,7 @@ static void furi_hal_flash_begin_with_core2(bool erase_flag) {
/* Take sempahopre and prevent core2 from anything funky */ /* Take sempahopre and prevent core2 from anything funky */
if(LL_HSEM_1StepLock(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) != 0) { if(LL_HSEM_1StepLock(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) != 0) {
taskEXIT_CRITICAL(); taskEXIT_CRITICAL();
furi_check(!furi_hal_cortex_timer_is_expired(timer));
furi_thread_yield(); furi_thread_yield();
continue; continue;
} }
@ -231,17 +246,13 @@ static void furi_hal_flush_cache(void) {
bool furi_hal_flash_wait_last_operation(uint32_t timeout) { bool furi_hal_flash_wait_last_operation(uint32_t timeout) {
uint32_t error = 0; uint32_t error = 0;
uint32_t countdown = 0;
/* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
Even if the FLASH operation fails, the BUSY flag will be reset and an error Even if the FLASH operation fails, the BUSY flag will be reset and an error
flag will be set */ flag will be set */
countdown = timeout; FuriHalCortexTimer timer = furi_hal_cortex_timer_get(timeout * 1000);
while(READ_BIT(FLASH->SR, FLASH_SR_BSY)) { while(READ_BIT(FLASH->SR, FLASH_SR_BSY)) {
if(LL_SYSTICK_IsActiveCounterFlag()) { if(furi_hal_cortex_timer_is_expired(timer)) {
countdown--;
}
if(countdown == 0) {
return false; return false;
} }
} }
@ -264,12 +275,9 @@ bool furi_hal_flash_wait_last_operation(uint32_t timeout) {
CLEAR_BIT(FLASH->SR, error); CLEAR_BIT(FLASH->SR, error);
/* Wait for control register to be written */ /* Wait for control register to be written */
countdown = timeout; timer = furi_hal_cortex_timer_get(timeout * 1000);
while(READ_BIT(FLASH->SR, FLASH_SR_CFGBSY)) { while(READ_BIT(FLASH->SR, FLASH_SR_CFGBSY)) {
if(LL_SYSTICK_IsActiveCounterFlag()) { if(furi_hal_cortex_timer_is_expired(timer)) {
countdown--;
}
if(countdown == 0) {
return false; return false;
} }
} }

@ -1 +1 @@
Subproject commit 06b8133fa295474507b55b1a5695d4b8bf804ed6 Subproject commit c4cec8ae57a79e949a184cd0b4117a008a0a25a7

View File

@ -112,6 +112,8 @@ def DistCommand(env, name, source, **kw):
def generate(env): def generate(env):
if not env["VERBOSE"]:
env.SetDefault(COPROCOMSTR="\tCOPRO\t${TARGET}")
env.AddMethod(AddFwProject) env.AddMethod(AddFwProject)
env.AddMethod(DistCommand) env.AddMethod(DistCommand)
env.AddMethod(AddOpenOCDFlashTarget) env.AddMethod(AddOpenOCDFlashTarget)
@ -147,7 +149,7 @@ def generate(env):
'--stack_file="${COPRO_STACK_BIN}" ' '--stack_file="${COPRO_STACK_BIN}" '
"--stack_addr=${COPRO_STACK_ADDR} ", "--stack_addr=${COPRO_STACK_ADDR} ",
], ],
"\tCOPRO\t${TARGET}", "$COPROCOMSTR",
) )
), ),
} }

View File

@ -34,7 +34,7 @@ class Copro:
self.mcu_copro = None self.mcu_copro = None
self.logger = logging.getLogger(self.__class__.__name__) self.logger = logging.getLogger(self.__class__.__name__)
def loadCubeInfo(self, cube_dir, cube_version): def loadCubeInfo(self, cube_dir, reference_cube_version):
if not os.path.isdir(cube_dir): if not os.path.isdir(cube_dir):
raise Exception(f'"{cube_dir}" doesn\'t exists') raise Exception(f'"{cube_dir}" doesn\'t exists')
self.cube_dir = cube_dir self.cube_dir = cube_dir
@ -50,7 +50,7 @@ class Copro:
if not cube_version or not cube_version.startswith("FW.WB"): if not cube_version or not cube_version.startswith("FW.WB"):
raise Exception(f"Incorrect Cube package or version info") raise Exception(f"Incorrect Cube package or version info")
cube_version = cube_version.replace("FW.WB.", "", 1) cube_version = cube_version.replace("FW.WB.", "", 1)
if cube_version != cube_version: if cube_version != reference_cube_version:
raise Exception(f"Unsupported cube version") raise Exception(f"Unsupported cube version")
self.version = cube_version self.version = cube_version

View File

@ -335,7 +335,9 @@ class FlipperStorage:
def _check_no_error(self, response, path=None): def _check_no_error(self, response, path=None):
if self.has_error(response): if self.has_error(response):
raise FlipperStorageException.from_error_code(self.get_error(response)) raise FlipperStorageException.from_error_code(
path, self.get_error(response)
)
def size(self, path: str): def size(self, path: str):
"""file size on Flipper""" """file size on Flipper"""