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:
parent
a3aaf50ecd
commit
70a9823e05
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user