Keep SHCI for unsupported Radio Stack (#960)

* bt: don't stop shci on wrong stack. Start radios stack if FUS is running
* bt: code clean up, f6 target sync

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
gornekich 2022-01-14 11:39:41 +03:00 committed by GitHub
parent a3aaf50ecd
commit 70a9823e05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 64 additions and 4 deletions

View File

@ -179,6 +179,25 @@ bool ble_glue_is_radio_stack_ready() {
return ble_glue->status == BleGlueStatusRadioStackStarted; return ble_glue->status == BleGlueStatusRadioStackStarted;
} }
bool ble_glue_radio_stack_fw_launch_started() {
bool ret = false;
// Get FUS status
SHCI_FUS_GetState_ErrorCode_t err_code = 0;
uint8_t state = SHCI_C2_FUS_GetState(&err_code);
if(state == FUS_STATE_VALUE_IDLE) {
// When FUS is running we can't read radio stack version correctly
// Trying to start radio stack fw, which leads to reset
FURI_LOG_W(TAG, "FUS is running. Restart to launch Radio Stack");
SHCI_CmdStatus_t status = SHCI_C2_FUS_StartWs();
if(status) {
FURI_LOG_E(TAG, "Failed to start Radio Stack with status: %02X", status);
} else {
ret = true;
}
}
return ret;
}
static void ble_glue_sys_status_not_callback(SHCI_TL_CmdStatus_t status) { static void ble_glue_sys_status_not_callback(SHCI_TL_CmdStatus_t status) {
switch(status) { switch(status) {
case SHCI_TL_CmdBusy: case SHCI_TL_CmdBusy:

View File

@ -43,8 +43,15 @@ void ble_glue_set_key_storage_changed_callback(
BleGlueKeyStorageChangedCallback callback, BleGlueKeyStorageChangedCallback callback,
void* context); void* context);
/** Stop SHCI thread */
void ble_glue_thread_stop(); void ble_glue_thread_stop();
/** Restart MCU to launch radio stack firmware if necessary
*
* @return true on radio stack start command
*/
bool ble_glue_radio_stack_fw_launch_started();
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -122,11 +122,15 @@ bool furi_hal_bt_start_radio_stack() {
ble_glue_thread_stop(); ble_glue_thread_stop();
break; break;
} }
// If FUS is running, start radio stack fw
if(ble_glue_radio_stack_fw_launch_started()) {
// If FUS is running do nothing and wait for system reset
furi_crash("Waiting for FUS to launch radio stack firmware");
}
// Check weather we support radio stack // Check weather we support radio stack
if(!furi_hal_bt_radio_stack_is_supported(&info)) { if(!furi_hal_bt_radio_stack_is_supported(&info)) {
FURI_LOG_E(TAG, "Unsupported radio stack"); FURI_LOG_E(TAG, "Unsupported radio stack");
LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); // Don't stop SHCI for crypto enclave support
ble_glue_thread_stop();
break; break;
} }
// Starting radio stack // Starting radio stack

View File

@ -179,6 +179,25 @@ bool ble_glue_is_radio_stack_ready() {
return ble_glue->status == BleGlueStatusRadioStackStarted; return ble_glue->status == BleGlueStatusRadioStackStarted;
} }
bool ble_glue_radio_stack_fw_launch_started() {
bool ret = false;
// Get FUS status
SHCI_FUS_GetState_ErrorCode_t err_code = 0;
uint8_t state = SHCI_C2_FUS_GetState(&err_code);
if(state == FUS_STATE_VALUE_IDLE) {
// When FUS is running we can't read radio stack version correctly
// Trying to start radio stack fw, which leads to reset
FURI_LOG_W(TAG, "FUS is running. Restart to launch Radio Stack");
SHCI_CmdStatus_t status = SHCI_C2_FUS_StartWs();
if(status) {
FURI_LOG_E(TAG, "Failed to start Radio Stack with status: %02X", status);
} else {
ret = true;
}
}
return ret;
}
static void ble_glue_sys_status_not_callback(SHCI_TL_CmdStatus_t status) { static void ble_glue_sys_status_not_callback(SHCI_TL_CmdStatus_t status) {
switch(status) { switch(status) {
case SHCI_TL_CmdBusy: case SHCI_TL_CmdBusy:

View File

@ -43,8 +43,15 @@ void ble_glue_set_key_storage_changed_callback(
BleGlueKeyStorageChangedCallback callback, BleGlueKeyStorageChangedCallback callback,
void* context); void* context);
/** Stop SHCI thread */
void ble_glue_thread_stop(); void ble_glue_thread_stop();
/** Restart MCU to launch radio stack firmware if necessary
*
* @return true on radio stack start command
*/
bool ble_glue_radio_stack_fw_launch_started();
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -122,11 +122,15 @@ bool furi_hal_bt_start_radio_stack() {
ble_glue_thread_stop(); ble_glue_thread_stop();
break; break;
} }
// If FUS is running, start radio stack fw
if(ble_glue_radio_stack_fw_launch_started()) {
// If FUS is running do nothing and wait for system reset
furi_crash("Waiting for FUS to launch radio stack firmware");
}
// Check weather we support radio stack // Check weather we support radio stack
if(!furi_hal_bt_radio_stack_is_supported(&info)) { if(!furi_hal_bt_radio_stack_is_supported(&info)) {
FURI_LOG_E(TAG, "Unsupported radio stack"); FURI_LOG_E(TAG, "Unsupported radio stack");
LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); // Don't stop SHCI for crypto enclave support
ble_glue_thread_stop();
break; break;
} }
// Starting radio stack // Starting radio stack