Skip to content

Commit 10027bc

Browse files
committed
[rtl872x] hal: use the BLE mac address from BLE calibration data in efuse
1 parent e902b65 commit 10027bc

File tree

2 files changed

+33
-25
lines changed

2 files changed

+33
-25
lines changed

hal/src/rtl872x/ble_hal.cpp

+25-11
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ bool addressEqual(const hal_ble_addr_t& srcAddr, const hal_ble_addr_t& destAddr)
158158
return (srcAddr.addr_type == destAddr.addr_type && !memcmp(srcAddr.addr, destAddr.addr, BLE_SIG_ADDR_LEN));
159159
}
160160

161-
hal_ble_addr_t chipDefaultAddress() {
161+
hal_ble_addr_t chipDefaultPublicAddress() {
162162
hal_ble_addr_t localAddr = {};
163163
hal_get_ble_mac_address(localAddr.addr, BLE_SIG_ADDR_LEN, nullptr);
164164
localAddr.addr_type = BLE_SIG_ADDR_TYPE_PUBLIC;
@@ -924,23 +924,37 @@ int BleGap::getDeviceName(char* deviceName, size_t len) const {
924924
}
925925

926926
int BleGap::setDeviceAddress(const hal_ble_addr_t* address) {
927-
hal_ble_addr_t newAddr = {};
928-
if (address == nullptr) {
929-
// default to reserved MAC address for this platform
930-
newAddr = chipDefaultAddress();
931-
} else {
932-
newAddr = *address;
927+
CHECK_FALSE(isAdvertising(), SYSTEM_ERROR_INVALID_STATE);
928+
CHECK_FALSE(scanning(), SYSTEM_ERROR_INVALID_STATE);
929+
// RTL872x doesn't support changing the the public address.
930+
// But to be compatible with existing BLE platforms, it should accept nulllptr.
931+
if (!address) {
932+
addr_ = chipDefaultPublicAddress();
933+
return SYSTEM_ERROR_NONE;
933934
}
934-
if (newAddr.addr_type != BLE_SIG_ADDR_TYPE_PUBLIC && newAddr.addr_type != BLE_SIG_ADDR_TYPE_RANDOM_STATIC) {
935+
if (address->addr_type != BLE_SIG_ADDR_TYPE_RANDOM_STATIC) {
935936
return SYSTEM_ERROR_INVALID_ARGUMENT;
936937
}
937-
if (newAddr.addr_type == BLE_SIG_ADDR_TYPE_RANDOM_STATIC && (newAddr.addr[5] & 0xC0) != 0xC0) {
938+
if ((address->addr[5] & 0xC0) != 0xC0) {
938939
// For random static address, the two most significant bits of the address shall be equal to 1.
939940
return SYSTEM_ERROR_INVALID_ARGUMENT;
940941
}
942+
uint8_t addr[BLE_SIG_ADDR_LEN] = {};
943+
memcpy(addr, address->addr, BLE_SIG_ADDR_LEN);
944+
CHECK_RTL(le_cfg_local_identity_address(addr, GAP_IDENT_ADDR_RAND));
945+
CHECK_RTL(le_set_gap_param(GAP_PARAM_RANDOM_ADDR, BLE_SIG_ADDR_LEN, addr));
946+
addr_ = *address;
941947

942-
CHECK_RTL(le_cfg_local_identity_address(newAddr.addr, (newAddr.addr_type == BLE_SIG_ADDR_TYPE_PUBLIC) ? GAP_IDENT_ADDR_PUBLIC : GAP_IDENT_ADDR_RAND));
943-
addr_ = newAddr;
948+
uint8_t advLocalAddrType = GAP_LOCAL_ADDR_LE_PUBLIC;
949+
if (address->addr_type == BLE_SIG_ADDR_TYPE_RANDOM_STATIC) {
950+
advLocalAddrType = GAP_LOCAL_ADDR_LE_RANDOM;
951+
}
952+
CHECK_RTL(le_adv_set_param(GAP_PARAM_ADV_LOCAL_ADDR_TYPE, sizeof(advLocalAddrType), &advLocalAddrType));
953+
uint8_t scanLocalAddrType = GAP_LOCAL_ADDR_LE_PUBLIC;
954+
if (address->addr_type == BLE_SIG_ADDR_TYPE_RANDOM_STATIC) {
955+
scanLocalAddrType = GAP_LOCAL_ADDR_LE_RANDOM;
956+
}
957+
CHECK_RTL(le_scan_set_param(GAP_PARAM_SCAN_LOCAL_ADDR_TYPE, sizeof(uint8_t), &scanLocalAddrType));
944958

945959
return SYSTEM_ERROR_NONE;
946960
}

hal/src/rtl872x/deviceid_hal.cpp

+8-14
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,15 @@ using namespace particle;
4343
#define EFUSE_SUCCESS 1
4444
#define EFUSE_FAILURE 0
4545

46+
#define BLE_MAC_OFFSET 0x190
4647
#define WIFI_MAC_OFFSET 0x11A
4748
#define MOBILE_SECRET_OFFSET 0x160
4849
#define SERIAL_NUMBER_OFFSET 0x16F
4950
#define HARDWARE_DATA_OFFSET 0x178
5051
#define HARDWARE_MODEL_OFFSET 0x17B
5152

5253
#define WIFI_MAC_SIZE 6
54+
#define BLE_MAC_SIZE 6
5355
#define SERIAL_NUMBER_FRONT_PART_SIZE 9
5456
#define HARDWARE_DATA_SIZE 4
5557
#define HARDWARE_MODEL_SIZE 4
@@ -84,13 +86,6 @@ int readLogicalEfuse(uint32_t offset, uint8_t* buf, size_t size) {
8486
return SYSTEM_ERROR_NONE;
8587
};
8688

87-
// big-endian
88-
int readBaseMacAddress(uint8_t* dest, size_t destLen) {
89-
// The parameters should have been checked
90-
CHECK(readLogicalEfuse(WIFI_MAC_OFFSET, dest, destLen));
91-
return WIFI_MAC_SIZE;
92-
}
93-
9489
} // Anonymous
9590

9691
unsigned hal_get_device_id(uint8_t* dest, unsigned destLen) {
@@ -113,16 +108,15 @@ int HAL_Get_Device_Identifier(const char** name, char* buf, size_t buflen, unsig
113108
}
114109

115110
int hal_get_ble_mac_address(uint8_t* dest, size_t destLen, void* reserved) {
116-
CHECK_TRUE(dest && destLen >= WIFI_MAC_SIZE, SYSTEM_ERROR_INVALID_ARGUMENT);
117-
uint8_t mac[WIFI_MAC_SIZE] = {};
118-
destLen = WIFI_MAC_SIZE;
119-
CHECK(readBaseMacAddress(mac, WIFI_MAC_SIZE));
111+
CHECK_TRUE(dest && destLen >= BLE_MAC_SIZE, SYSTEM_ERROR_INVALID_ARGUMENT);
112+
uint8_t mac[BLE_MAC_SIZE] = {};
113+
destLen = BLE_MAC_SIZE;
114+
CHECK(readLogicalEfuse(BLE_MAC_OFFSET, mac, BLE_MAC_SIZE));
120115
// As per BLE spec, we store BLE data in little-endian
121-
for (uint8_t i = 0, j = WIFI_MAC_SIZE - 1; i < WIFI_MAC_SIZE; i++, j--) {
116+
for (uint8_t i = 0, j = BLE_MAC_SIZE - 1; i < BLE_MAC_SIZE; i++, j--) {
122117
dest[i] = mac[j];
123118
}
124-
dest[0] += BLE_MAC_DELTA;
125-
return WIFI_MAC_SIZE;
119+
return BLE_MAC_SIZE;
126120
}
127121

128122

0 commit comments

Comments
 (0)