[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:
		
							parent
							
								
									4d015a1106
								
							
						
					
					
						commit
						1ef70c0bb4
					
				| @ -20,7 +20,7 @@ DIST_SUFFIX = "local" | ||||
| COPRO_OB_DATA = "scripts/ob.data" | ||||
| 
 | ||||
| # Must match lib/STM32CubeWB version | ||||
| COPRO_CUBE_VERSION = "1.16.0" | ||||
| COPRO_CUBE_VERSION = "1.15.0" | ||||
| 
 | ||||
| COPRO_CUBE_DIR = "lib/STM32CubeWB" | ||||
| 
 | ||||
|  | ||||
| @ -199,8 +199,8 @@ Function,-,LL_EXTI_StructInit,void,LL_EXTI_InitTypeDef* | ||||
| Function,-,LL_GPIO_DeInit,ErrorStatus,GPIO_TypeDef* | ||||
| Function,+,LL_GPIO_Init,ErrorStatus,"GPIO_TypeDef*, LL_GPIO_InitTypeDef*" | ||||
| Function,-,LL_GPIO_StructInit,void,LL_GPIO_InitTypeDef* | ||||
| Function,-,LL_I2C_DeInit,ErrorStatus,const I2C_TypeDef* | ||||
| Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, const LL_I2C_InitTypeDef*" | ||||
| Function,-,LL_I2C_DeInit,ErrorStatus,I2C_TypeDef* | ||||
| Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, LL_I2C_InitTypeDef*" | ||||
| Function,-,LL_I2C_StructInit,void,LL_I2C_InitTypeDef* | ||||
| Function,-,LL_Init1msTick,void,uint32_t | ||||
| Function,+,LL_LPTIM_DeInit,ErrorStatus,LPTIM_TypeDef* | ||||
|  | ||||
| 
 | 
| @ -231,8 +231,8 @@ Function,-,LL_EXTI_StructInit,void,LL_EXTI_InitTypeDef* | ||||
| Function,-,LL_GPIO_DeInit,ErrorStatus,GPIO_TypeDef* | ||||
| Function,+,LL_GPIO_Init,ErrorStatus,"GPIO_TypeDef*, LL_GPIO_InitTypeDef*" | ||||
| Function,-,LL_GPIO_StructInit,void,LL_GPIO_InitTypeDef* | ||||
| Function,-,LL_I2C_DeInit,ErrorStatus,const I2C_TypeDef* | ||||
| Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, const LL_I2C_InitTypeDef*" | ||||
| Function,-,LL_I2C_DeInit,ErrorStatus,I2C_TypeDef* | ||||
| Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, LL_I2C_InitTypeDef*" | ||||
| Function,-,LL_I2C_StructInit,void,LL_I2C_InitTypeDef* | ||||
| Function,-,LL_Init1msTick,void,uint32_t | ||||
| Function,+,LL_LPTIM_DeInit,ErrorStatus,LPTIM_TypeDef* | ||||
|  | ||||
| 
 | 
| @ -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]; | ||||
| 
 | ||||
| _Static_assert( | ||||
|     sizeof(SHCI_C2_Ble_Init_Cmd_Packet_t) == 58, | ||||
|     "Ble stack config structure size mismatch (check new config options - last updated for v.1.16.0)"); | ||||
|     sizeof(SHCI_C2_Ble_Init_Cmd_Packet_t) == 57, | ||||
|     "Ble stack config structure size mismatch (check new config options - last updated for v.1.15.0)"); | ||||
| 
 | ||||
| typedef struct { | ||||
|     FuriMutex* hci_mtx; | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| #include <furi_hal_flash.h> | ||||
| #include <furi_hal_bt.h> | ||||
| #include <furi_hal_power.h> | ||||
| #include <furi_hal_cortex.h> | ||||
| #include <furi.h> | ||||
| #include <ble/ble.h> | ||||
| #include <interface/patterns/ble_thread/shci/shci.h> | ||||
| @ -26,6 +27,16 @@ | ||||
| #define FURI_HAL_FLASH_OPT_KEY2 0x4C5D6E7F | ||||
| #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_FLASH_PROGRAM_ADDRESS(__VALUE__)                                             \ | ||||
|     (((__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++) | ||||
|         ; | ||||
| 
 | ||||
|     FuriHalCortexTimer timer = furi_hal_cortex_timer_get(FURI_HAL_FLASH_C2_LOCK_TIMEOUT_MS * 1000); | ||||
|     while(true) { | ||||
|         /* Wait till flash controller become usable */ | ||||
|         while(LL_FLASH_IsActiveFlag_OperationSuspended()) { | ||||
|             furi_check(!furi_hal_cortex_timer_is_expired(timer)); | ||||
|             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  */ | ||||
|         if(LL_HSEM_IsSemaphoreLocked(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID)) { | ||||
|             taskEXIT_CRITICAL(); | ||||
|             furi_check(!furi_hal_cortex_timer_is_expired(timer)); | ||||
|             furi_thread_yield(); | ||||
|             continue; | ||||
|         } | ||||
| @ -150,6 +164,7 @@ static void furi_hal_flash_begin_with_core2(bool erase_flag) { | ||||
|         /* Take sempahopre and prevent core2 from anything funky */ | ||||
|         if(LL_HSEM_1StepLock(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) != 0) { | ||||
|             taskEXIT_CRITICAL(); | ||||
|             furi_check(!furi_hal_cortex_timer_is_expired(timer)); | ||||
|             furi_thread_yield(); | ||||
|             continue; | ||||
|         } | ||||
| @ -231,17 +246,13 @@ static void furi_hal_flush_cache(void) { | ||||
| 
 | ||||
| bool furi_hal_flash_wait_last_operation(uint32_t timeout) { | ||||
|     uint32_t error = 0; | ||||
|     uint32_t countdown = 0; | ||||
| 
 | ||||
|     /* 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 | ||||
|        flag will be set */ | ||||
|     countdown = timeout; | ||||
|     FuriHalCortexTimer timer = furi_hal_cortex_timer_get(timeout * 1000); | ||||
|     while(READ_BIT(FLASH->SR, FLASH_SR_BSY)) { | ||||
|         if(LL_SYSTICK_IsActiveCounterFlag()) { | ||||
|             countdown--; | ||||
|         } | ||||
|         if(countdown == 0) { | ||||
|         if(furi_hal_cortex_timer_is_expired(timer)) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| @ -264,12 +275,9 @@ bool furi_hal_flash_wait_last_operation(uint32_t timeout) { | ||||
|     CLEAR_BIT(FLASH->SR, error); | ||||
| 
 | ||||
|     /* 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)) { | ||||
|         if(LL_SYSTICK_IsActiveCounterFlag()) { | ||||
|             countdown--; | ||||
|         } | ||||
|         if(countdown == 0) { | ||||
|         if(furi_hal_cortex_timer_is_expired(timer)) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| Subproject commit 06b8133fa295474507b55b1a5695d4b8bf804ed6 | ||||
| Subproject commit c4cec8ae57a79e949a184cd0b4117a008a0a25a7 | ||||
| @ -112,6 +112,8 @@ def DistCommand(env, name, source, **kw): | ||||
| 
 | ||||
| 
 | ||||
| def generate(env): | ||||
|     if not env["VERBOSE"]: | ||||
|         env.SetDefault(COPROCOMSTR="\tCOPRO\t${TARGET}") | ||||
|     env.AddMethod(AddFwProject) | ||||
|     env.AddMethod(DistCommand) | ||||
|     env.AddMethod(AddOpenOCDFlashTarget) | ||||
| @ -147,7 +149,7 @@ def generate(env): | ||||
|                         '--stack_file="${COPRO_STACK_BIN}" ' | ||||
|                         "--stack_addr=${COPRO_STACK_ADDR} ", | ||||
|                     ], | ||||
|                     "\tCOPRO\t${TARGET}", | ||||
|                     "$COPROCOMSTR", | ||||
|                 ) | ||||
|             ), | ||||
|         } | ||||
|  | ||||
| @ -34,7 +34,7 @@ class Copro: | ||||
|         self.mcu_copro = None | ||||
|         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): | ||||
|             raise Exception(f'"{cube_dir}" doesn\'t exists') | ||||
|         self.cube_dir = cube_dir | ||||
| @ -50,7 +50,7 @@ class Copro: | ||||
|         if not cube_version or not cube_version.startswith("FW.WB"): | ||||
|             raise Exception(f"Incorrect Cube package or version info") | ||||
|         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") | ||||
|         self.version = cube_version | ||||
| 
 | ||||
|  | ||||
| @ -335,7 +335,9 @@ class FlipperStorage: | ||||
| 
 | ||||
|     def _check_no_error(self, response, path=None): | ||||
|         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): | ||||
|         """file size on Flipper""" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 hedger
						hedger