Mbed Cloud Example Project - LPC546xx (Starting Version)

Fork of mbed-cloud-example-lpc546xx by Mac Lobdell

Committer:
clarkjarvis
Date:
Thu Oct 11 18:52:54 2018 +0000
Revision:
10:5b42f7323c71
Parent:
0:1f42bb53bff5
Reverted generated file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maclobdell 0:1f42bb53bff5 1 # Simple Mbed Cloud Client template application
maclobdell 0:1f42bb53bff5 2
maclobdell 0:1f42bb53bff5 3 ## Overview
maclobdell 0:1f42bb53bff5 4
maclobdell 0:1f42bb53bff5 5 This is a template application for platform vendors. It demonstrates how to create a simple Mbed Cloud Client application that can connect to Mbed Cloud, register resources and get ready to receive a firmware update.
maclobdell 0:1f42bb53bff5 6
maclobdell 0:1f42bb53bff5 7 It's intended to be customized to add platform-specific features (such as sensors and actuators) and configure the connectivity and storage to work **out-of-the-box**. The Simple Mbed Cloud Client template application works in **developer mode** by default.
maclobdell 0:1f42bb53bff5 8
maclobdell 0:1f42bb53bff5 9 ## Setup process
maclobdell 0:1f42bb53bff5 10
maclobdell 0:1f42bb53bff5 11 This is a summary of the process for developers to get started and get a device connected to Mbed Cloud.
maclobdell 0:1f42bb53bff5 12
maclobdell 0:1f42bb53bff5 13 ### Mbed Online IDE
maclobdell 0:1f42bb53bff5 14
maclobdell 0:1f42bb53bff5 15 1. Import the application into the Online IDE.
maclobdell 0:1f42bb53bff5 16 2. Add the API key to establish connection to Mbed Cloud.
maclobdell 0:1f42bb53bff5 17 3. Install the developer certificate.
maclobdell 0:1f42bb53bff5 18 4. Compile and program.
maclobdell 0:1f42bb53bff5 19
maclobdell 0:1f42bb53bff5 20 ### Mbed CLI tools
maclobdell 0:1f42bb53bff5 21
maclobdell 0:1f42bb53bff5 22 1. Import the application in developer's desktop:
maclobdell 0:1f42bb53bff5 23
maclobdell 0:1f42bb53bff5 24 ```
maclobdell 0:1f42bb53bff5 25 mbed import https://os.mbed.com/teams/mbed-os-examples/code/mbed-cloud-example
maclobdell 0:1f42bb53bff5 26 cd mbed-cloud-example
maclobdell 0:1f42bb53bff5 27 ```
maclobdell 0:1f42bb53bff5 28
maclobdell 0:1f42bb53bff5 29 2. Download the developer certificate from Mbed Cloud.
maclobdell 0:1f42bb53bff5 30 3. Compile and program:
maclobdell 0:1f42bb53bff5 31
maclobdell 0:1f42bb53bff5 32 ```
maclobdell 0:1f42bb53bff5 33 mbed compile -t <toolchain> -m <target> -f
maclobdell 0:1f42bb53bff5 34 ```
maclobdell 0:1f42bb53bff5 35
maclobdell 0:1f42bb53bff5 36 ## Porting to a new platform
maclobdell 0:1f42bb53bff5 37
maclobdell 0:1f42bb53bff5 38 ### Requirements
maclobdell 0:1f42bb53bff5 39
maclobdell 0:1f42bb53bff5 40 The hardware requirements for Mbed OS platforms to support Mbed Cloud Client are [here](https://cloud.mbed.com/docs/current/cloud-requirements/index.html).
maclobdell 0:1f42bb53bff5 41
maclobdell 0:1f42bb53bff5 42 In general, to start creating a secure connected product, you need a microcontroller that has the following features.
maclobdell 0:1f42bb53bff5 43 * RAM: 128K or more
maclobdell 0:1f42bb53bff5 44 * Flash: 512K or more
maclobdell 0:1f42bb53bff5 45 * True Random Number Generator (TRNG)
maclobdell 0:1f42bb53bff5 46 * Real Time Clock (RTC)
maclobdell 0:1f42bb53bff5 47
maclobdell 0:1f42bb53bff5 48 Additionally, to use Mbed Cloud Client, the microcontroller needs to support the following in Mbed OS (latest version preferred) or in a compatible driver library:
maclobdell 0:1f42bb53bff5 49 * A storage device (SDcard, SPI Flash, Data Flash)
maclobdell 0:1f42bb53bff5 50 * IP connectivity (Ethernet, WiFi, Cellular, 6LoWPAN, Thread)
maclobdell 0:1f42bb53bff5 51
maclobdell 0:1f42bb53bff5 52 For the Firmware update over the air (FOTA), you need the following:
maclobdell 0:1f42bb53bff5 53 * [FlashIAP](https://github.com/ARMmbed/mbed-os/blob/master/drivers/FlashIAP.h) - Flash In-Application Programming (IAP)
maclobdell 0:1f42bb53bff5 54 * [Mbed Bootloader](https://github.com/ARMmbed/mbed-bootloader) or a bootloader compatible with Mbed Cloud Client.
maclobdell 0:1f42bb53bff5 55
maclobdell 0:1f42bb53bff5 56 ### References
maclobdell 0:1f42bb53bff5 57
maclobdell 0:1f42bb53bff5 58 * Check which Mbed OS platforms are supported in the [Mbed Cloud quick-start guide](https://cloud.test.mbed.com/quick-start).
maclobdell 0:1f42bb53bff5 59 * Check which storage options are available [here](https://os.mbed.com/docs/v5.8/reference/storage.html).
maclobdell 0:1f42bb53bff5 60 * Check which network options are available [here](https://os.mbed.com/docs/v5.8/reference/network-socket.html).
maclobdell 0:1f42bb53bff5 61
maclobdell 0:1f42bb53bff5 62
maclobdell 0:1f42bb53bff5 63 ### Porting steps
maclobdell 0:1f42bb53bff5 64
maclobdell 0:1f42bb53bff5 65 Supporting a new derivative platform requires the following steps:
maclobdell 0:1f42bb53bff5 66
maclobdell 0:1f42bb53bff5 67 * Fork the template and create an example application for your platform in https://os.mbed.com.
maclobdell 0:1f42bb53bff5 68 * (Optional) Change the connectivity interface. Ethernet is the default - see `main.cpp`.
maclobdell 0:1f42bb53bff5 69 * (Optional) Change the filesystem and/or the block device for storage. FAT filesystem over SD card is the default. See `main.cpp`.
maclobdell 0:1f42bb53bff5 70 * (Optional) Make minor changes in `mbed_app.json` to support multiple platforms with same connectivity and storage.
maclobdell 0:1f42bb53bff5 71
maclobdell 0:1f42bb53bff5 72 <span class="notes">**Note:** Make sure that the application works out-of-the-box and no changes are required in the `main.cpp` file. The goal is to deliver a great UX to our developers.</span>
maclobdell 0:1f42bb53bff5 73
maclobdell 0:1f42bb53bff5 74 ### Porting example
maclobdell 0:1f42bb53bff5 75
maclobdell 0:1f42bb53bff5 76 In this example, an app with an SD card and on-chip Ethernet is taken to a custom board that has an MCU + Wi-Fi module.
maclobdell 0:1f42bb53bff5 77
maclobdell 0:1f42bb53bff5 78 #### Changing the storage option
maclobdell 0:1f42bb53bff5 79
maclobdell 0:1f42bb53bff5 80 ##### For an SD card
maclobdell 0:1f42bb53bff5 81
maclobdell 0:1f42bb53bff5 82 1. Add the SD card driver (`sd-driver.lib`) if it is not already added.
maclobdell 0:1f42bb53bff5 83
maclobdell 0:1f42bb53bff5 84 On the command line:
maclobdell 0:1f42bb53bff5 85
maclobdell 0:1f42bb53bff5 86 ```
maclobdell 0:1f42bb53bff5 87 mbed add https://github.com/armmbed/sd-driver
maclobdell 0:1f42bb53bff5 88 ```
maclobdell 0:1f42bb53bff5 89
maclobdell 0:1f42bb53bff5 90 2. In the online compiler, click **Import**, then click here to import from URL.
maclobdell 0:1f42bb53bff5 91 3. Then enter https://github.com/armmbed/sd-driver for the **Source URL** and **Import As:** Library.
maclobdell 0:1f42bb53bff5 92 4. Include the header files for the SD driver and FAT file system:
maclobdell 0:1f42bb53bff5 93
maclobdell 0:1f42bb53bff5 94 ```cpp
maclobdell 0:1f42bb53bff5 95 #include "SDBlockDevice.h"
maclobdell 0:1f42bb53bff5 96 #include "FATFileSystem.h"
maclobdell 0:1f42bb53bff5 97 ```
maclobdell 0:1f42bb53bff5 98
maclobdell 0:1f42bb53bff5 99 5. Declare the global objects for the SD card and file system.
maclobdell 0:1f42bb53bff5 100
maclobdell 0:1f42bb53bff5 101 ```cpp
maclobdell 0:1f42bb53bff5 102 SDBlockDevice bd(SPI_MOSI, SPI_MISO, SPI_CLK, SPI_CS);
maclobdell 0:1f42bb53bff5 103 FATFileSystem fs("sd", &sd);
maclobdell 0:1f42bb53bff5 104 ```
maclobdell 0:1f42bb53bff5 105
maclobdell 0:1f42bb53bff5 106 <span class="notes">**Note:** The `SPI_*` macros represent the pin names. The names can be defined in a variety of places including the sd-driver, your project’s configuration file (`mbed_app.json`) or the `pinnames.h` file for the target that defines the default pin names. You can use other pin names depending on the platform and the connections.</span>
maclobdell 0:1f42bb53bff5 107
maclobdell 0:1f42bb53bff5 108 For example, if the SPI signals for the SD card interface are connected on an Arduino compatible shield, you may define them like this:
maclobdell 0:1f42bb53bff5 109
maclobdell 0:1f42bb53bff5 110 ```cpp
maclobdell 0:1f42bb53bff5 111 SDBlockDevice sd(D11, D12, D13, D10);
maclobdell 0:1f42bb53bff5 112 ```
maclobdell 0:1f42bb53bff5 113
maclobdell 0:1f42bb53bff5 114 ##### For SPI Flash (devices that support SFDP)
maclobdell 0:1f42bb53bff5 115
maclobdell 0:1f42bb53bff5 116 <Please note that this section of the document is under construction. More information is needed.>
maclobdell 0:1f42bb53bff5 117
maclobdell 0:1f42bb53bff5 118 1. Add the SPI Flash driver (`spif-driver`) if it is not already added.
maclobdell 0:1f42bb53bff5 119
maclobdell 0:1f42bb53bff5 120 ```
maclobdell 0:1f42bb53bff5 121 mbed add https://github.com/ARMmbed/spif-driver
maclobdell 0:1f42bb53bff5 122 ```
maclobdell 0:1f42bb53bff5 123
maclobdell 0:1f42bb53bff5 124 2. Include the header files for the SPI Flash driver and LitteFS file system. For SPI Flash, we recommend LittleFS file system which supports wear leveling.
maclobdell 0:1f42bb53bff5 125
maclobdell 0:1f42bb53bff5 126 ```cpp
maclobdell 0:1f42bb53bff5 127 #include "SPIFBlockDevice.h"
maclobdell 0:1f42bb53bff5 128 #include "LittleFileSystem.h"
maclobdell 0:1f42bb53bff5 129 ```
maclobdell 0:1f42bb53bff5 130
maclobdell 0:1f42bb53bff5 131 3. Declare the global objects for the SD card and file system:
maclobdell 0:1f42bb53bff5 132
maclobdell 0:1f42bb53bff5 133 ```cpp
maclobdell 0:1f42bb53bff5 134 SPIFBlockDevice spif(SPI_MOSI, SPI_MISO, SPI_CLK, SPI_CS);
maclobdell 0:1f42bb53bff5 135 LittleFileSystem fs("fs", &spif);
maclobdell 0:1f42bb53bff5 136 ```
maclobdell 0:1f42bb53bff5 137
maclobdell 0:1f42bb53bff5 138 4. Update the construction of the `SimpleMbedCloudClient` object to pass in the file system and block device:
maclobdell 0:1f42bb53bff5 139
maclobdell 0:1f42bb53bff5 140 ```cpp
maclobdell 0:1f42bb53bff5 141 SimpleMbedCloudClient client(&net, &spif, &fs);
maclobdell 0:1f42bb53bff5 142 ```
maclobdell 0:1f42bb53bff5 143
maclobdell 0:1f42bb53bff5 144 #### Changing the network interface
maclobdell 0:1f42bb53bff5 145
maclobdell 0:1f42bb53bff5 146 ##### For Ethernet
maclobdell 0:1f42bb53bff5 147
maclobdell 0:1f42bb53bff5 148 The Ethernet interface is included within Mbed OS, so you do not need to add a library.
maclobdell 0:1f42bb53bff5 149
maclobdell 0:1f42bb53bff5 150 1. Include the header file for the interface.
maclobdell 0:1f42bb53bff5 151
maclobdell 0:1f42bb53bff5 152 ```
maclobdell 0:1f42bb53bff5 153 #include "EthernetInterface.h"
maclobdell 0:1f42bb53bff5 154 ```
maclobdell 0:1f42bb53bff5 155
maclobdell 0:1f42bb53bff5 156 2. Declare the network interface object.
maclobdell 0:1f42bb53bff5 157
maclobdell 0:1f42bb53bff5 158 ```
maclobdell 0:1f42bb53bff5 159 EthernetInterface net;
maclobdell 0:1f42bb53bff5 160 ```
maclobdell 0:1f42bb53bff5 161
maclobdell 0:1f42bb53bff5 162 3. Connect the interface.
maclobdell 0:1f42bb53bff5 163
maclobdell 0:1f42bb53bff5 164 ```
maclobdell 0:1f42bb53bff5 165 status = net.connect();
maclobdell 0:1f42bb53bff5 166 ```
maclobdell 0:1f42bb53bff5 167
maclobdell 0:1f42bb53bff5 168 4. When the Mbed Cloud Client is started, pass the network interface.
maclobdell 0:1f42bb53bff5 169
maclobdell 0:1f42bb53bff5 170 ```
maclobdell 0:1f42bb53bff5 171 SimpleMbedCloudClient client(&net, &sd, &fs);
maclobdell 0:1f42bb53bff5 172 ```
maclobdell 0:1f42bb53bff5 173
maclobdell 0:1f42bb53bff5 174 ##### For WiFi
maclobdell 0:1f42bb53bff5 175
maclobdell 0:1f42bb53bff5 176 This example references the ESP8266 WiFi module, but the instructions are applicable to other modules.
maclobdell 0:1f42bb53bff5 177
maclobdell 0:1f42bb53bff5 178 1. Add the ESP8266 WiFi interface driver (esp8266-driver) if it is not already added.
maclobdell 0:1f42bb53bff5 179
maclobdell 0:1f42bb53bff5 180 ```
maclobdell 0:1f42bb53bff5 181 Mbed add https://github.com/ARMmbed/esp8266-driver
maclobdell 0:1f42bb53bff5 182 ```
maclobdell 0:1f42bb53bff5 183
maclobdell 0:1f42bb53bff5 184 <span class="notes">**Note:** You may have to update the firmware inside the ESP8266 module.</span>
maclobdell 0:1f42bb53bff5 185
maclobdell 0:1f42bb53bff5 186 2. Include the header file for the interface.
maclobdell 0:1f42bb53bff5 187
maclobdell 0:1f42bb53bff5 188 ```cpp
maclobdell 0:1f42bb53bff5 189 #include "ESP8266Interface.h"
maclobdell 0:1f42bb53bff5 190 ```
maclobdell 0:1f42bb53bff5 191
maclobdell 0:1f42bb53bff5 192 3. Add the driver configuration information in `mbed_app.json` (located at the top level of the Mbed Cloud Connect example project).
maclobdell 0:1f42bb53bff5 193
maclobdell 0:1f42bb53bff5 194 ```json
maclobdell 0:1f42bb53bff5 195 "config": {
maclobdell 0:1f42bb53bff5 196 "wifi-ssid": {
maclobdell 0:1f42bb53bff5 197 "help": "WiFi SSID",
maclobdell 0:1f42bb53bff5 198 "value": "\"SSID\""
maclobdell 0:1f42bb53bff5 199 },
maclobdell 0:1f42bb53bff5 200 "wifi-password": {
maclobdell 0:1f42bb53bff5 201 "help": "WiFi Password",
maclobdell 0:1f42bb53bff5 202 "value": "\"PASSWORD\""
maclobdell 0:1f42bb53bff5 203 }
maclobdell 0:1f42bb53bff5 204 }
maclobdell 0:1f42bb53bff5 205 ```
maclobdell 0:1f42bb53bff5 206
maclobdell 0:1f42bb53bff5 207 4. Declare the network interface object.
maclobdell 0:1f42bb53bff5 208
maclobdell 0:1f42bb53bff5 209 ```cpp
maclobdell 0:1f42bb53bff5 210 ESP8266Interface net(D1, D0);
maclobdell 0:1f42bb53bff5 211 ```
maclobdell 0:1f42bb53bff5 212
maclobdell 0:1f42bb53bff5 213 5. Connect the interface.
maclobdell 0:1f42bb53bff5 214
maclobdell 0:1f42bb53bff5 215 ```cpp
maclobdell 0:1f42bb53bff5 216 nsapi_error_t status = net.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
maclobdell 0:1f42bb53bff5 217 ```
maclobdell 0:1f42bb53bff5 218
maclobdell 0:1f42bb53bff5 219 6. When the Mbed Cloud Client is started, pass the network interface.
maclobdell 0:1f42bb53bff5 220
maclobdell 0:1f42bb53bff5 221 ```cpp
maclobdell 0:1f42bb53bff5 222 SimpleMbedCloudClient client(&net, &sd, &fs);
maclobdell 0:1f42bb53bff5 223 ```
maclobdell 0:1f42bb53bff5 224
maclobdell 0:1f42bb53bff5 225 #### Changing the target MCU
maclobdell 0:1f42bb53bff5 226
maclobdell 0:1f42bb53bff5 227 To change the target board to another board that is supported by Mbed OS, simply change the target name.
maclobdell 0:1f42bb53bff5 228
maclobdell 0:1f42bb53bff5 229 ##### Using the command line
maclobdell 0:1f42bb53bff5 230
maclobdell 0:1f42bb53bff5 231 Use the -m option.
maclobdell 0:1f42bb53bff5 232
maclobdell 0:1f42bb53bff5 233 ```
maclobdell 0:1f42bb53bff5 234 mbed compile -m Hexiwear -t GCC_ARM
maclobdell 0:1f42bb53bff5 235 ```
maclobdell 0:1f42bb53bff5 236
maclobdell 0:1f42bb53bff5 237 ##### Using the online compiler
maclobdell 0:1f42bb53bff5 238
maclobdell 0:1f42bb53bff5 239 Click the platform name on the top right corner, then select another platform.
maclobdell 0:1f42bb53bff5 240
maclobdell 0:1f42bb53bff5 241 ##### Using an IDE
maclobdell 0:1f42bb53bff5 242
maclobdell 0:1f42bb53bff5 243 First re-export (create project files) for the target with the command line.
maclobdell 0:1f42bb53bff5 244
maclobdell 0:1f42bb53bff5 245 ```
maclobdell 0:1f42bb53bff5 246 mbed export -m Hexiwear -i uvision
maclobdell 0:1f42bb53bff5 247 ```
maclobdell 0:1f42bb53bff5 248
maclobdell 0:1f42bb53bff5 249 #### Creating a custom target board
maclobdell 0:1f42bb53bff5 250
maclobdell 0:1f42bb53bff5 251 Read the Mbed OS [Contributing](https://os.mbed.com/docs/latest/reference/porting-targets.html) documentation on how to add a new target.
maclobdell 0:1f42bb53bff5 252
maclobdell 0:1f42bb53bff5 253 #### Update the application logic
maclobdell 0:1f42bb53bff5 254
maclobdell 0:1f42bb53bff5 255 The template example uses a ticker object to periodically fire a software interrupt to simulate button presses. Let’s say you want to make an actual button press.
maclobdell 0:1f42bb53bff5 256
maclobdell 0:1f42bb53bff5 257 By default, there is a Ticker object, which fires every five seconds and invokes a callback function.
maclobdell 0:1f42bb53bff5 258
maclobdell 0:1f42bb53bff5 259 ```cpp
maclobdell 0:1f42bb53bff5 260 Ticker timer;
maclobdell 0:1f42bb53bff5 261 timer.attach(eventQueue.event(&fake_button_press), 5.0);
maclobdell 0:1f42bb53bff5 262 ```
maclobdell 0:1f42bb53bff5 263
maclobdell 0:1f42bb53bff5 264 This callback function changes the `button_res` resource:
maclobdell 0:1f42bb53bff5 265
maclobdell 0:1f42bb53bff5 266 ```cpp
maclobdell 0:1f42bb53bff5 267 void fake_button_press() {
maclobdell 0:1f42bb53bff5 268 int v = button_res->get_value_int() + 1;
maclobdell 0:1f42bb53bff5 269
maclobdell 0:1f42bb53bff5 270 button_res->set_value(v);
maclobdell 0:1f42bb53bff5 271
maclobdell 0:1f42bb53bff5 272 printf("Simulated button clicked %d times\n", v);
maclobdell 0:1f42bb53bff5 273 }
maclobdell 0:1f42bb53bff5 274 ```
maclobdell 0:1f42bb53bff5 275
maclobdell 0:1f42bb53bff5 276 If you want to change this to an actual button, here is how to do it:
maclobdell 0:1f42bb53bff5 277
maclobdell 0:1f42bb53bff5 278 1. Remove:
maclobdell 0:1f42bb53bff5 279
maclobdell 0:1f42bb53bff5 280 ```cpp
maclobdell 0:1f42bb53bff5 281 Ticker timer;
maclobdell 0:1f42bb53bff5 282 timer.attach(eventQueue.event(&fake_button_press), 5.0);
maclobdell 0:1f42bb53bff5 283 ```
maclobdell 0:1f42bb53bff5 284
maclobdell 0:1f42bb53bff5 285 1. Declare an `InterruptIn` object on the button, and attach the callback function to the `fall` handler:
maclobdell 0:1f42bb53bff5 286
maclobdell 0:1f42bb53bff5 287 ```cpp
maclobdell 0:1f42bb53bff5 288 InterruptIn btn(BUTTON1);
maclobdell 0:1f42bb53bff5 289 btn.fall(eventQueue.event(&fake_button_press), 5.0);
maclobdell 0:1f42bb53bff5 290 ```
maclobdell 0:1f42bb53bff5 291
maclobdell 0:1f42bb53bff5 292 1. Rename `fake_button_press` to `real_button_press`.
maclobdell 0:1f42bb53bff5 293
maclobdell 0:1f42bb53bff5 294
maclobdell 0:1f42bb53bff5 295 #### Updating the LwM2M objects
maclobdell 0:1f42bb53bff5 296
maclobdell 0:1f42bb53bff5 297 See guide at [TODO]
maclobdell 0:1f42bb53bff5 298
maclobdell 0:1f42bb53bff5 299 ## Enabling firmware updates
maclobdell 0:1f42bb53bff5 300
maclobdell 0:1f42bb53bff5 301 To enable firmware updates, a compatible bootloader needs to be added in the `tools/` folder. The process to merge the application with the bootloader currently only works when building with Mbed CLI. In the future, this combine process will be done automatically by Mbed tools.
maclobdell 0:1f42bb53bff5 302
maclobdell 0:1f42bb53bff5 303 1. Compile [mbed-bootloader](https://github.com/armmbed/mbed-bootloader) for the platform and storage configuration used in this application. Place the binary in the tools folder.
maclobdell 0:1f42bb53bff5 304
maclobdell 0:1f42bb53bff5 305 1. Add a section to `mbed_app.json` under `target_overrides` with the bootloader configuration. For example:
maclobdell 0:1f42bb53bff5 306
maclobdell 0:1f42bb53bff5 307 ```json
maclobdell 0:1f42bb53bff5 308 "K64F": {
maclobdell 0:1f42bb53bff5 309 "target.mbed_app_start" : "0x0000a400",
maclobdell 0:1f42bb53bff5 310 "update-client.bootloader-details" : "0x00007188",
maclobdell 0:1f42bb53bff5 311 "sotp-section-1-address" : "(32*1024)",
maclobdell 0:1f42bb53bff5 312 "sotp-section-1-size" : "( 4*1024)",
maclobdell 0:1f42bb53bff5 313 "sotp-section-2-address" : "(36*1024)",
maclobdell 0:1f42bb53bff5 314 "sotp-section-2-size" : "( 4*1024)",
maclobdell 0:1f42bb53bff5 315 "update-client.application-details": "(40*1024)"
maclobdell 0:1f42bb53bff5 316 }
maclobdell 0:1f42bb53bff5 317 ```
maclobdell 0:1f42bb53bff5 318
maclobdell 0:1f42bb53bff5 319 Next, instruct your users to do the following:
maclobdell 0:1f42bb53bff5 320
maclobdell 0:1f42bb53bff5 321 1. Install the [manifest tool](https://github.com/armmbed/manifest-tool).
maclobdell 0:1f42bb53bff5 322 1. Generate an update certificate:
maclobdell 0:1f42bb53bff5 323
maclobdell 0:1f42bb53bff5 324 ```
maclobdell 0:1f42bb53bff5 325 $ manifest-tool init -a YOUR_MBED_CLOUD_API_KEY -d yourdomain.com -m device-model-id -q --force
maclobdell 0:1f42bb53bff5 326 ```
maclobdell 0:1f42bb53bff5 327
maclobdell 0:1f42bb53bff5 328 <span class="notes">**Note:** Make sure to replace `YOUR_MBED_CLOUD_API_KEY` with an Mbed Cloud API key.
maclobdell 0:1f42bb53bff5 329
maclobdell 0:1f42bb53bff5 330 1. Build the application and combine it with the bootloader:
maclobdell 0:1f42bb53bff5 331
maclobdell 0:1f42bb53bff5 332 ```
maclobdell 0:1f42bb53bff5 333 $ mbed compile -m YOUR_TARGET -t GCC_ARM
maclobdell 0:1f42bb53bff5 334 $ tools/combine_bootloader_with_app.py -m YOUR_TARGET -a BUILD/YOUR_TARGET/GCC_ARM/simple-mbed-cloud-client-example_application.bin -o combined.bin
maclobdell 0:1f42bb53bff5 335 ```
maclobdell 0:1f42bb53bff5 336
maclobdell 0:1f42bb53bff5 337 1. Flash `combined.bin` to the development board.
maclobdell 0:1f42bb53bff5 338 1. Write down the endpoint ID of the board. You need it to start the update.
maclobdell 0:1f42bb53bff5 339
maclobdell 0:1f42bb53bff5 340 Now, a firmware update can be scheduled as explained in the [Mbed Cloud documentation](https://cloud.mbed.com/docs/current/updating-firmware/index.html). You can do it with the manifest tool itself or via the Mbed Cloud portal. Here we explain how to do it with the manifest tool.
maclobdell 0:1f42bb53bff5 341
maclobdell 0:1f42bb53bff5 342 1. Change the application, for example by changing some strings in `main.cpp`.
maclobdell 0:1f42bb53bff5 343 1. Compile the application:
maclobdell 0:1f42bb53bff5 344
maclobdell 0:1f42bb53bff5 345 ```
maclobdell 0:1f42bb53bff5 346 $ mbed compile -m YOUR_TARGET -t GCC_ARM
maclobdell 0:1f42bb53bff5 347 ```
maclobdell 0:1f42bb53bff5 348
maclobdell 0:1f42bb53bff5 349 1. The manifest tool can both sign the update - using the private key generated earlier - and upload it to Mbed Cloud in a single command. Run:
maclobdell 0:1f42bb53bff5 350
maclobdell 0:1f42bb53bff5 351 ```
maclobdell 0:1f42bb53bff5 352 $ manifest-tool update device -p BUILD/YOUR_BOARD_NAME/GCC_ARM/simple-mbed-cloud-client-example_application.bin -D YOUR_ENDPOINT_NAME
maclobdell 0:1f42bb53bff5 353 ```
maclobdell 0:1f42bb53bff5 354
maclobdell 0:1f42bb53bff5 355 Replace `YOUR_BOARD_NAME` with the name of your development board, and replace `YOUR_ENDPOINT_NAME` with the endpoint name in Mbed Cloud.
maclobdell 0:1f42bb53bff5 356
maclobdell 0:1f42bb53bff5 357 1. Inspect the logs on the device to see the update progress. It looks similar to:
maclobdell 0:1f42bb53bff5 358
maclobdell 0:1f42bb53bff5 359 ```
maclobdell 0:1f42bb53bff5 360 Firmware download requested
maclobdell 0:1f42bb53bff5 361 Authorization granted
maclobdell 0:1f42bb53bff5 362 Downloading: [+++- ] 6 %
maclobdell 0:1f42bb53bff5 363 ```
maclobdell 0:1f42bb53bff5 364
maclobdell 0:1f42bb53bff5 365 1. When the download completes, the firmware is verified. If everything is OK, the firmware update is applied.
maclobdell 0:1f42bb53bff5 366
maclobdell 0:1f42bb53bff5 367 ## Known issues
maclobdell 0:1f42bb53bff5 368
maclobdell 0:1f42bb53bff5 369 Please check the issues reported on github.
maclobdell 0:1f42bb53bff5 370