Merge remote-tracking branch 'origin/dev' into release-candidate
This commit is contained in:
		
						commit
						31e47e97bd
					
				| @ -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" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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* | ||||||
|  | |||||||
| 
 | 
| @ -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* | ||||||
|  | |||||||
| 
 | 
| @ -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; | ||||||
|  | |||||||
| @ -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 | ||||||
| @ -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", | ||||||
|                 ) |                 ) | ||||||
|             ), |             ), | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -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 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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""" | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Aleksandr Kutuzov
						Aleksandr Kutuzov