Explorar o código

[FL-1811] FuriHal: move core2 startup to hal init stage, prevent working with flash controller till core2 startup finish. #704

あく %!s(int64=4) %!d(string=hai) anos
pai
achega
72ca76097a

+ 0 - 1
applications/bt/bt_service/bt.c

@@ -62,7 +62,6 @@ Bt* bt_alloc() {
 int32_t bt_srv() {
     Bt* bt = bt_alloc();
     furi_record_create("bt", bt);
-    furi_hal_bt_init();
 
     if(!furi_hal_bt_wait_startup()) {
         FURI_LOG_E(BT_SERVICE_TAG, "Core2 startup failed");

+ 2 - 0
firmware/targets/f6/ble-glue/app_entry.c

@@ -138,8 +138,10 @@ static void APPE_SysUserEvtRx( void * pPayload ) {
   // APPD_EnableCPU2( );
   
   if (APP_BLE_Init()) {
+    FURI_LOG_I("Core2", "BLE stack started");
     ble_glue_status = BleGlueStatusStarted;
   } else {
+    FURI_LOG_E("Core2", "BLE stack startup failed");
     ble_glue_status = BleGlueStatusBroken;
   }
   furi_hal_power_insomnia_exit();

+ 13 - 17
firmware/targets/f6/furi-hal/furi-hal-bt.c

@@ -46,7 +46,7 @@ bool furi_hal_bt_is_alive() {
 
 bool furi_hal_bt_wait_startup() {
     uint8_t counter = 0;
-    while (APPE_Status() == BleGlueStatusStartup) {
+    while (!(APPE_Status() == BleGlueStatusStarted || APPE_Status() == BleGlueStatusBroken)) {
         osDelay(10);
         counter++;
         if (counter > 1000) {
@@ -60,27 +60,23 @@ bool furi_hal_bt_lock_flash() {
     if (!furi_hal_bt_wait_startup()) {
         return false;
     }
-    if (APPE_Status() == BleGlueStatusUninitialized) {
-        HAL_FLASH_Unlock();
-    } else {
-        while (HAL_HSEM_FastTake(CFG_HW_FLASH_SEMID) != HAL_OK) {
-            osDelay(1);
-        }
-        SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_ON);
-        HAL_FLASH_Unlock();
-        while(LL_FLASH_IsOperationSuspended()) {};
+    
+    while (HAL_HSEM_FastTake(CFG_HW_FLASH_SEMID) != HAL_OK) {
+        osDelay(1);
     }
+    
+    SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_ON);
+    HAL_FLASH_Unlock();
+
+    while(LL_FLASH_IsOperationSuspended()) {};
+
     return true;
 }
 
 void furi_hal_bt_unlock_flash() {
-    if (APPE_Status() == BleGlueStatusUninitialized) {
-        HAL_FLASH_Lock();
-    } else {
-        SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF);
-        HAL_FLASH_Lock();
-        HAL_HSEM_Release(CFG_HW_FLASH_SEMID, HSEM_CPU1_COREID);
-    }
+    SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF);
+    HAL_FLASH_Lock();
+    HAL_HSEM_Release(CFG_HW_FLASH_SEMID, HSEM_CPU1_COREID);
 }
 
 void furi_hal_bt_start_tone_tx(uint8_t channel, uint8_t power) {

+ 1 - 0
firmware/targets/f6/furi-hal/furi-hal.c

@@ -47,6 +47,7 @@ void furi_hal_init() {
     furi_hal_subghz_init();
     furi_hal_nfc_init();
     furi_hal_rfid_init();
+    furi_hal_bt_init();
 
     // FreeRTOS glue
     furi_hal_os_init();

+ 2 - 0
firmware/targets/f7/ble-glue/app_entry.c

@@ -138,8 +138,10 @@ static void APPE_SysUserEvtRx( void * pPayload ) {
   // APPD_EnableCPU2( );
   
   if (APP_BLE_Init()) {
+    FURI_LOG_I("Core2", "BLE stack started");
     ble_glue_status = BleGlueStatusStarted;
   } else {
+    FURI_LOG_E("Core2", "BLE stack startup failed");
     ble_glue_status = BleGlueStatusBroken;
   }
   furi_hal_power_insomnia_exit();

+ 13 - 17
firmware/targets/f7/furi-hal/furi-hal-bt.c

@@ -46,7 +46,7 @@ bool furi_hal_bt_is_alive() {
 
 bool furi_hal_bt_wait_startup() {
     uint8_t counter = 0;
-    while (APPE_Status() == BleGlueStatusStartup) {
+    while (!(APPE_Status() == BleGlueStatusStarted || APPE_Status() == BleGlueStatusBroken)) {
         osDelay(10);
         counter++;
         if (counter > 1000) {
@@ -60,27 +60,23 @@ bool furi_hal_bt_lock_flash() {
     if (!furi_hal_bt_wait_startup()) {
         return false;
     }
-    if (APPE_Status() == BleGlueStatusUninitialized) {
-        HAL_FLASH_Unlock();
-    } else {
-        while (HAL_HSEM_FastTake(CFG_HW_FLASH_SEMID) != HAL_OK) {
-            osDelay(1);
-        }
-        SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_ON);
-        HAL_FLASH_Unlock();
-        while(LL_FLASH_IsOperationSuspended()) {};
+    
+    while (HAL_HSEM_FastTake(CFG_HW_FLASH_SEMID) != HAL_OK) {
+        osDelay(1);
     }
+    
+    SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_ON);
+    HAL_FLASH_Unlock();
+
+    while(LL_FLASH_IsOperationSuspended()) {};
+
     return true;
 }
 
 void furi_hal_bt_unlock_flash() {
-    if (APPE_Status() == BleGlueStatusUninitialized) {
-        HAL_FLASH_Lock();
-    } else {
-        SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF);
-        HAL_FLASH_Lock();
-        HAL_HSEM_Release(CFG_HW_FLASH_SEMID, HSEM_CPU1_COREID);
-    }
+    SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF);
+    HAL_FLASH_Lock();
+    HAL_HSEM_Release(CFG_HW_FLASH_SEMID, HSEM_CPU1_COREID);
 }
 
 void furi_hal_bt_start_tone_tx(uint8_t channel, uint8_t power) {

+ 1 - 0
firmware/targets/f7/furi-hal/furi-hal.c

@@ -47,6 +47,7 @@ void furi_hal_init() {
     furi_hal_subghz_init();
     furi_hal_nfc_init();
     furi_hal_rfid_init();
+    furi_hal_bt_init();
 
     // FreeRTOS glue
     furi_hal_os_init();