19static constexpr uint8_t DFU_TRIGGER_MAGIC[] = {
'D',
'F',
'U'};
21static constexpr uint8_t DFU_GPREGRET_OTA = 0xA8;
25static constexpr uint16_t DFU_TRIGGER_PERM = BT_GATT_PERM_WRITE_AUTHEN;
27static constexpr uint16_t DFU_TRIGGER_PERM = BT_GATT_PERM_WRITE;
30static OTAComponent *global_ota_component;
32static ssize_t dfu_trigger_write(
struct bt_conn *conn,
const struct bt_gatt_attr *attr,
const void *buf, uint16_t
len,
33 uint16_t offset, uint8_t
flags) {
35 return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET);
37 if (
len !=
sizeof(DFU_TRIGGER_MAGIC) || memcmp(buf, DFU_TRIGGER_MAGIC,
sizeof(DFU_TRIGGER_MAGIC)) != 0) {
38 return BT_GATT_ERR(BT_ATT_ERR_VALUE_NOT_ALLOWED);
47 BT_GATT_PRIMARY_SERVICE(BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0xe5b10001, 0x9c3a, 0x4f5d, 0x8a1b,
49 BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0xe5b10002, 0x9c3a, 0x4f5d, 0x8a1b, 0x2c3d4e5f6071)),
50 BT_GATT_CHRC_WRITE, DFU_TRIGGER_PERM,
nullptr, dfu_trigger_write,
nullptr));
56 this->
defer([
this]() {
57 ESP_LOGI(TAG,
"DFU mode requested, restarting into the bootloader");
58#ifdef USE_OTA_STATE_LISTENER
62 NRF_POWER->GPREGRET = DFU_GPREGRET_OTA;
68 ESP_LOGCONFIG(TAG,
"Over-The-Air Updates:\n"
69 " bootloader: Adafruit nRF52 (BLE DFU)");
BT_GATT_SERVICE_DEFINE(dfu_trigger_svc, BT_GATT_PRIMARY_SERVICE(BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0xe5b10001, 0x9c3a, 0x4f5d, 0x8a1b, 0x2c3d4e5f6071))), BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0xe5b10002, 0x9c3a, 0x4f5d, 0x8a1b, 0x2c3d4e5f6071)), BT_GATT_CHRC_WRITE, DFU_TRIGGER_PERM, nullptr, dfu_trigger_write, nullptr))