mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* mbed Microcontroller Library
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2006-2013 ARM Limited
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 5 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 6 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 7 *
kenjiArai 0:5b88d5760320 8 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 9 *
kenjiArai 0:5b88d5760320 10 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 11 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 13 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 14 * limitations under the License.
kenjiArai 0:5b88d5760320 15 */
kenjiArai 0:5b88d5760320 16
kenjiArai 0:5b88d5760320 17 #ifdef TARGET_NRF51822 /* DFU only supported on nrf51 platforms */
kenjiArai 0:5b88d5760320 18
kenjiArai 0:5b88d5760320 19 #ifndef __BLE_DFU_SERVICE_H__
kenjiArai 0:5b88d5760320 20 #define __BLE_DFU_SERVICE_H__
kenjiArai 0:5b88d5760320 21
kenjiArai 0:5b88d5760320 22 #if BLE_FEATURE_GATT_SERVER
kenjiArai 0:5b88d5760320 23
kenjiArai 0:5b88d5760320 24 #include "ble/BLE.h"
kenjiArai 0:5b88d5760320 25 #include "ble/UUID.h"
kenjiArai 0:5b88d5760320 26
kenjiArai 0:5b88d5760320 27 extern "C" {
kenjiArai 0:5b88d5760320 28 #include "dfu_app_handler.h"
kenjiArai 0:5b88d5760320 29 }
kenjiArai 0:5b88d5760320 30
kenjiArai 0:5b88d5760320 31 extern const uint8_t DFUServiceBaseUUID[];
kenjiArai 0:5b88d5760320 32 extern const uint16_t DFUServiceShortUUID;
kenjiArai 0:5b88d5760320 33 extern const uint16_t DFUServiceControlCharacteristicShortUUID;
kenjiArai 0:5b88d5760320 34
kenjiArai 0:5b88d5760320 35 extern const uint8_t DFUServiceUUID[];
kenjiArai 0:5b88d5760320 36 extern const uint8_t DFUServiceControlCharacteristicUUID[];
kenjiArai 0:5b88d5760320 37 extern const uint8_t DFUServicePacketCharacteristicUUID[];
kenjiArai 0:5b88d5760320 38
kenjiArai 0:5b88d5760320 39 /**
kenjiArai 0:5b88d5760320 40 * @class DFUService
kenjiArai 0:5b88d5760320 41 * @brief Device Firmware Update Service.
kenjiArai 0:5b88d5760320 42 */
kenjiArai 0:5b88d5760320 43 class DFUService {
kenjiArai 0:5b88d5760320 44 public:
kenjiArai 0:5b88d5760320 45 /**
kenjiArai 0:5b88d5760320 46 * @brief Signature for the handover callback. The application may provide this
kenjiArai 0:5b88d5760320 47 * callback when setting up the DFU service. The callback is then
kenjiArai 0:5b88d5760320 48 * invoked before handing control over to the bootloader.
kenjiArai 0:5b88d5760320 49 */
kenjiArai 0:5b88d5760320 50 typedef void (*ResetPrepare_t)(void);
kenjiArai 0:5b88d5760320 51
kenjiArai 0:5b88d5760320 52 public:
kenjiArai 0:5b88d5760320 53 /**
kenjiArai 0:5b88d5760320 54 * @brief Adds Device Firmware Update Service to an existing BLE object.
kenjiArai 0:5b88d5760320 55 *
kenjiArai 0:5b88d5760320 56 * @param[ref] _ble
kenjiArai 0:5b88d5760320 57 * BLE object for the underlying controller.
kenjiArai 0:5b88d5760320 58 * @param[in] _handoverCallback
kenjiArai 0:5b88d5760320 59 * Application-specific handover callback.
kenjiArai 0:5b88d5760320 60 */
kenjiArai 0:5b88d5760320 61 DFUService(BLE &_ble, ResetPrepare_t _handoverCallback = NULL) :
kenjiArai 0:5b88d5760320 62 ble(_ble),
kenjiArai 0:5b88d5760320 63 controlPoint(DFUServiceControlCharacteristicUUID, controlBytes, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
kenjiArai 0:5b88d5760320 64 packet(DFUServicePacketCharacteristicUUID, packetBytes, SIZEOF_PACKET_BYTES, SIZEOF_PACKET_BYTES,
kenjiArai 0:5b88d5760320 65 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE),
kenjiArai 0:5b88d5760320 66 controlBytes(),
kenjiArai 0:5b88d5760320 67 packetBytes() {
kenjiArai 0:5b88d5760320 68 static bool serviceAdded = false; /* We only add the DFU service once. */
kenjiArai 0:5b88d5760320 69 if (serviceAdded) {
kenjiArai 0:5b88d5760320 70 return;
kenjiArai 0:5b88d5760320 71 }
kenjiArai 0:5b88d5760320 72
kenjiArai 0:5b88d5760320 73 /* Set an initial value for control bytes, so that the application's DFU service can
kenjiArai 0:5b88d5760320 74 * be distinguished from the real DFU service provided by the bootloader. */
kenjiArai 0:5b88d5760320 75 controlBytes[0] = 0xFF;
kenjiArai 0:5b88d5760320 76 controlBytes[1] = 0xFF;
kenjiArai 0:5b88d5760320 77
kenjiArai 0:5b88d5760320 78 GattCharacteristic *dfuChars[] = {&controlPoint, &packet};
kenjiArai 0:5b88d5760320 79 GattService dfuService(DFUServiceUUID, dfuChars, sizeof(dfuChars) / sizeof(GattCharacteristic *));
kenjiArai 0:5b88d5760320 80
kenjiArai 0:5b88d5760320 81 ble.addService(dfuService);
kenjiArai 0:5b88d5760320 82 handoverCallback = _handoverCallback;
kenjiArai 0:5b88d5760320 83 serviceAdded = true;
kenjiArai 0:5b88d5760320 84
kenjiArai 0:5b88d5760320 85 ble.onDataWritten(this, &DFUService::onDataWritten);
kenjiArai 0:5b88d5760320 86 }
kenjiArai 0:5b88d5760320 87
kenjiArai 0:5b88d5760320 88 /**
kenjiArai 0:5b88d5760320 89 * @brief Get the handle for the value attribute of the control characteristic.
kenjiArai 0:5b88d5760320 90 */
kenjiArai 0:5b88d5760320 91 uint16_t getControlHandle(void) const {
kenjiArai 0:5b88d5760320 92 return controlPoint.getValueHandle();
kenjiArai 0:5b88d5760320 93 }
kenjiArai 0:5b88d5760320 94
kenjiArai 0:5b88d5760320 95 /**
kenjiArai 0:5b88d5760320 96 * @brief This callback allows the DFU service to receive the initial trigger to
kenjiArai 0:5b88d5760320 97 * hand control over to the bootloader. First, the application is given a
kenjiArai 0:5b88d5760320 98 * chance to clean up.
kenjiArai 0:5b88d5760320 99 *
kenjiArai 0:5b88d5760320 100 * @param[in] params
kenjiArai 0:5b88d5760320 101 * Information about the characteristic being updated.
kenjiArai 0:5b88d5760320 102 */
kenjiArai 0:5b88d5760320 103 virtual void onDataWritten(const GattWriteCallbackParams *params) {
kenjiArai 0:5b88d5760320 104 if (params->handle == controlPoint.getValueHandle()) {
kenjiArai 0:5b88d5760320 105 /* At present, writing anything will do the trick - this needs to be improved. */
kenjiArai 0:5b88d5760320 106 if (handoverCallback) {
kenjiArai 0:5b88d5760320 107 handoverCallback();
kenjiArai 0:5b88d5760320 108 }
kenjiArai 0:5b88d5760320 109
kenjiArai 0:5b88d5760320 110 // Call bootloader_start implicitly trough a event handler call
kenjiArai 0:5b88d5760320 111 // it is a work around for bootloader_start not being public in sdk 8.1
kenjiArai 0:5b88d5760320 112 ble_dfu_t p_dfu;
kenjiArai 0:5b88d5760320 113 ble_dfu_evt_t p_evt;
kenjiArai 0:5b88d5760320 114
kenjiArai 0:5b88d5760320 115 p_dfu.conn_handle = params->connHandle;
kenjiArai 0:5b88d5760320 116 p_evt.ble_dfu_evt_type = BLE_DFU_START;
kenjiArai 0:5b88d5760320 117
kenjiArai 0:5b88d5760320 118 dfu_app_on_dfu_evt(&p_dfu, &p_evt);
kenjiArai 0:5b88d5760320 119 }
kenjiArai 0:5b88d5760320 120 }
kenjiArai 0:5b88d5760320 121
kenjiArai 0:5b88d5760320 122 protected:
kenjiArai 0:5b88d5760320 123 static const unsigned SIZEOF_CONTROL_BYTES = 2;
kenjiArai 0:5b88d5760320 124 static const unsigned SIZEOF_PACKET_BYTES = 20;
kenjiArai 0:5b88d5760320 125
kenjiArai 0:5b88d5760320 126 protected:
kenjiArai 0:5b88d5760320 127 BLE &ble;
kenjiArai 0:5b88d5760320 128
kenjiArai 0:5b88d5760320 129 /** Writing to the control characteristic triggers the handover to DFU
kenjiArai 0:5b88d5760320 130 * bootloader. At present, writing anything will do the trick - this needs
kenjiArai 0:5b88d5760320 131 * to be improved. */
kenjiArai 0:5b88d5760320 132 WriteOnlyArrayGattCharacteristic<uint8_t, SIZEOF_CONTROL_BYTES> controlPoint;
kenjiArai 0:5b88d5760320 133
kenjiArai 0:5b88d5760320 134 /** The packet characteristic in this service doesn't do anything meaningful;
kenjiArai 0:5b88d5760320 135 * it is only a placeholder to mimic the corresponding characteristic in the
kenjiArai 0:5b88d5760320 136 * actual DFU service implemented by the bootloader. Without this, some
kenjiArai 0:5b88d5760320 137 * FOTA clients might get confused, because service definitions change after
kenjiArai 0:5b88d5760320 138 * handing control over to the bootloader. */
kenjiArai 0:5b88d5760320 139 GattCharacteristic packet;
kenjiArai 0:5b88d5760320 140
kenjiArai 0:5b88d5760320 141 uint8_t controlBytes[SIZEOF_CONTROL_BYTES];
kenjiArai 0:5b88d5760320 142 uint8_t packetBytes[SIZEOF_PACKET_BYTES];
kenjiArai 0:5b88d5760320 143
kenjiArai 0:5b88d5760320 144 static ResetPrepare_t handoverCallback; /**< Application-specific handover callback. */
kenjiArai 0:5b88d5760320 145 };
kenjiArai 0:5b88d5760320 146
kenjiArai 0:5b88d5760320 147 #endif // BLE_FEATURE_GATT_SERVER
kenjiArai 0:5b88d5760320 148
kenjiArai 0:5b88d5760320 149 #endif /* #ifndef __BLE_DFU_SERVICE_H__*/
kenjiArai 0:5b88d5760320 150 #endif /* #ifdef TARGET_NRF51822 */