70 lines
2.4 KiB
C
70 lines
2.4 KiB
C
/***************************************************************************
|
|
*
|
|
* Copyright 2015-2019 BES.
|
|
* All rights reserved. All unpublished rights reserved.
|
|
*
|
|
* No part of this work may be used or reproduced in any form or by any
|
|
* means, or stored in a database or retrieval system, without prior written
|
|
* permission of BES.
|
|
*
|
|
* Use of this work is governed by a license granted by BES.
|
|
* This work contains confidential and proprietary information of
|
|
* BES. which is protected by copyright, trade secret,
|
|
* trademark and other intellectual property rights.
|
|
*
|
|
****************************************************************************/
|
|
#include "retention_ram.h"
|
|
#include "hal_timer.h"
|
|
#include "hal_trace.h"
|
|
#include "string.h"
|
|
|
|
#define OTA_RANDOM_BLE_BD_ADDR_MAGIC_CODE 0x51544F55
|
|
#define BLE_BD_ADDR_LEN 6
|
|
typedef struct {
|
|
uint32_t magicCode; // 0x51544F55: "UOTA" means the OTA firmware should use
|
|
// the BD address in this structure, otherwise it will
|
|
// generate a random BD address
|
|
uint8_t bleBdAddr[BLE_BD_ADDR_LEN];
|
|
} BLE_BD_ADDR_FOR_OTA_T;
|
|
|
|
// retained across the HW reset
|
|
BLE_BD_ADDR_FOR_OTA_T __attribute((section(".reboot_param"))) bleBdAddrForOta;
|
|
void fillBleBdAddrForOta(uint8_t *bdAddr) {
|
|
bleBdAddrForOta.magicCode = OTA_RANDOM_BLE_BD_ADDR_MAGIC_CODE;
|
|
memcpy(&(bleBdAddrForOta.bleBdAddr), bdAddr, BLE_BD_ADDR_LEN);
|
|
}
|
|
|
|
extern uint8_t ble_addr[BLE_BD_ADDR_LEN];
|
|
static unsigned int seed = 1;
|
|
|
|
static void set_rand_seed(unsigned int init) { seed = init; }
|
|
|
|
static int get_rand(void) {
|
|
// Based on Knuth "The Art of Computer Programming"
|
|
seed = seed * 1103515245 + 12345;
|
|
return ((unsigned int)(seed / 65536) % (32767 + 1));
|
|
}
|
|
|
|
void otaConfigureBleBdAddr(void) {
|
|
if (OTA_RANDOM_BLE_BD_ADDR_MAGIC_CODE == bleBdAddrForOta.magicCode) {
|
|
// use the BD address saved in bleBdAddrForOta
|
|
memcpy(&ble_addr, &(bleBdAddrForOta.bleBdAddr), BLE_BD_ADDR_LEN);
|
|
|
|
// clear the magic code
|
|
bleBdAddrForOta.magicCode = 0;
|
|
} else {
|
|
// generate the random BD static address
|
|
int randomData;
|
|
|
|
for (uint32_t index = 0; index < BLE_BD_ADDR_LEN / 2; index++) {
|
|
set_rand_seed(hal_sys_timer_get());
|
|
randomData = get_rand();
|
|
TRACE(2, "randomData %d is 0x%x", index, randomData);
|
|
memcpy(&(ble_addr[index * 2]), (uint8_t *)&randomData, 2);
|
|
}
|
|
|
|
// top two bits of the random static BD address are 1
|
|
ble_addr[5] |= 0xC0;
|
|
}
|
|
}
|