From b8b27a343a45c45ecd13885572040afd4e53bb7d Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Wed, 15 Jan 2025 14:32:23 +0100 Subject: [PATCH] feat(ble): support setting device name from trezor [no changelog] --- west/trezor/trezor-ble/prj.conf | 3 +- west/trezor/trezor-ble/src/ble/advertising.c | 36 ++++++++++--------- west/trezor/trezor-ble/src/ble/ble.c | 2 -- west/trezor/trezor-ble/src/ble/ble_internal.h | 2 +- west/trezor/trezor-ble/src/ble/management.c | 23 ++++++------ 5 files changed, 36 insertions(+), 30 deletions(-) diff --git a/west/trezor/trezor-ble/prj.conf b/west/trezor/trezor-ble/prj.conf index c2b2b478a6..5c0459b66c 100644 --- a/west/trezor/trezor-ble/prj.conf +++ b/west/trezor/trezor-ble/prj.conf @@ -36,7 +36,8 @@ CONFIG_POWEROFF=y CONFIG_BT=y CONFIG_BT_PERIPHERAL=y -CONFIG_BT_DEVICE_NAME="Trezor T3W1" +CONFIG_BT_DEVICE_NAME="Trezor BLE" +CONFIG_BT_DEVICE_NAME_DYNAMIC=y CONFIG_BT_DEVICE_APPEARANCE=833 CONFIG_BT_MAX_CONN=1 CONFIG_BT_MAX_PAIRED=8 diff --git a/west/trezor/trezor-ble/src/ble/advertising.c b/west/trezor/trezor-ble/src/ble/advertising.c index 0ceed6f1e3..0e8f5045fb 100644 --- a/west/trezor/trezor-ble/src/ble/advertising.c +++ b/west/trezor/trezor-ble/src/ble/advertising.c @@ -37,10 +37,7 @@ bool advertising_wl = false; uint8_t manufacturer_data[8] = {0xff, 0xff, 0, 0, 'T', '3', 'W', '1'}; -static const struct bt_data advertising_data[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN), -}; +static struct bt_data advertising_data[2]; static const struct bt_data scan_response_data[] = { BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_TRZ_VAL), @@ -64,22 +61,29 @@ void advertising_setup_wl(void) { bt_foreach_bond(BT_ID_DEFAULT, add_to_whitelist, NULL); } -void advertising_start(bool wl) { +void advertising_start(bool wl, uint8_t color, char *name, int name_len) { if (advertising) { - if (wl != advertising_wl) { - LOG_WRN("Restarting advertising"); - bt_le_adv_stop(); - } else { - LOG_WRN("Already advertising"); - - management_send_status_event(); - return; - } + LOG_WRN("Restarting advertising"); + bt_le_adv_stop(); } - int err; - manufacturer_data[3] = 0x03; // todo color + manufacturer_data[3] = color; + + advertising_data[0].type = BT_DATA_FLAGS; + advertising_data[0].data_len = 1; + static const uint8_t flags = (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR); + advertising_data[0].data = &flags; + + /* Fill second element for the name */ + advertising_data[1].type = BT_DATA_NAME_COMPLETE; + advertising_data[1].data_len = name_len; + advertising_data[1].data = (const uint8_t *)name; + + char gap_name[21] = {0}; + memcpy(gap_name, name, name_len); + + bt_set_name(gap_name); if (wl) { advertising_setup_wl(); diff --git a/west/trezor/trezor-ble/src/ble/ble.c b/west/trezor/trezor-ble/src/ble/ble.c index 38a2731c3a..5bf829deac 100644 --- a/west/trezor/trezor-ble/src/ble/ble.c +++ b/west/trezor/trezor-ble/src/ble/ble.c @@ -73,8 +73,6 @@ bool ble_init(void) { return 0; } - bt_set_name("TrezorGAP"); - advertising_init(); management_init(); diff --git a/west/trezor/trezor-ble/src/ble/ble_internal.h b/west/trezor/trezor-ble/src/ble/ble_internal.h index 7d21517ad5..4de37ce101 100644 --- a/west/trezor/trezor-ble/src/ble/ble_internal.h +++ b/west/trezor/trezor-ble/src/ble/ble_internal.h @@ -106,7 +106,7 @@ bool bonds_erase_current(void); // Initialization void advertising_init(void); // Start advertising, with or without whitelist -void advertising_start(bool wl); +void advertising_start(bool wl, uint8_t color, char *name, int name_len); // Stop advertising void advertising_stop(void); // Check if advertising is active diff --git a/west/trezor/trezor-ble/src/ble/management.c b/west/trezor/trezor-ble/src/ble/management.c index e15e095bc8..3995e603a2 100644 --- a/west/trezor/trezor-ble/src/ble/management.c +++ b/west/trezor/trezor-ble/src/ble/management.c @@ -62,15 +62,15 @@ void management_send_status_event(void) { void management_send_success_event(void) { uint8_t tx_data[] = { - INTERNAL_EVENT_SUCCESS, -}; + INTERNAL_EVENT_SUCCESS, + }; trz_comm_send_msg(NRF_SERVICE_BLE_MANAGER, tx_data, sizeof(tx_data)); } void management_send_failure_event(void) { uint8_t tx_data[] = { - INTERNAL_EVENT_FAILURE, -}; + INTERNAL_EVENT_FAILURE, + }; trz_comm_send_msg(NRF_SERVICE_BLE_MANAGER, tx_data, sizeof(tx_data)); } @@ -105,9 +105,12 @@ static void process_command(uint8_t *data, uint16_t len) { send_respons = false; management_send_status_event(); break; - case INTERNAL_CMD_ADVERTISING_ON: - advertising_start(data[1] != 0); - break; + case INTERNAL_CMD_ADVERTISING_ON: { + uint8_t color = data[2]; + char *name = &data[3]; + int name_len = strnlen(name, 20); + advertising_start(data[1] != 0, color, name, name_len); + } break; case INTERNAL_CMD_ADVERTISING_OFF: advertising_stop(); break; @@ -121,13 +124,13 @@ static void process_command(uint8_t *data, uint16_t len) { break; case INTERNAL_CMD_ALLOW_PAIRING: pairing_num_comp_reply(true); - break; + break; case INTERNAL_CMD_REJECT_PAIRING: pairing_num_comp_reply(false); - break; + break; case INTERNAL_CMD_UNPAIR: success = bonds_erase_current(); - break; + break; default: break; }