[メモ] BLE Nano(nRF51822) 無線でファームウェアアップデート(OTA-DFU)



## 概要
- nRF51822のDFU bootloaderサンプルを入れて、スマホアプリnRF ToolsのDFUから、OTAアップデートをする。
- ちなみに、OTA = Over The Air 無線で。

## 環境
- BLENano (nRF51822)
- SoftDevice S110 v8.0 (nRF51SDK v10.0付属) 
- nRF Tools (スマホアプリ - iPhone使ってます)
- MDK-ARM Lite v5.18 
- [nRF51_SDK_10.0.0_dc26b5e.zip](https://developer.nordicsemi.com/nRF5_SDK/nRF51_SDK_v10.x.x/nRF51_SDK_10.0.0_dc26b5e.zip)
- [nRFgo Studio](https://www.nordicsemi.com/chi/node_176/2.4GHz-RF/nRFgo-Studio)
    - `nrfutil.exe`: C:\Program Files (x86)\Nordic Semiconductor\nRFgo Studio\
    - `mergehex.exe`: `C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin`

## 手順
### DFUブートローダの作成
1. [nRF51_SDK_10.0.0_dc26b5e.zip](https://developer.nordicsemi.com/nRF5_SDK/nRF51_SDK_v10.x.x/nRF51_SDK_10.0.0_dc26b5e.zip)をダウンロードして、解凍
2. `nRF51_SDK_10.0.0_dc26b5e\examples\dfu\bootloader\` ここらへんがDFU ブートローダ関連。
<br>=> `nRF51_SDK_10.0.0_dc26b5e\examples\dfu\bootloader\pca10028\dual_bank_ble_s110\arm5_no_packs\dfu_dual_bank_ble_s110_pca10028.uvprojx`をダブルクリックして、MDK-ARMを立ち上げる
3. `nrf51422_xxac/Application/main.c`を開いて、必要あれば、ボタンとか、LEDのあたりのポート番号を直す。
    - `BOOTLOADER_BUTTON`は、BSP_BUTTON_3　=> BUTTON_4 => 20で、 BLENanoには関係なさそうなのでほっとく。ボタンつけたら、そのポート番号へ。
    - ボタンを押しながら起動で、DFUモードになる、ってことができる。

    ```c:main.c...LED周りだけ直す。といっても、書き込み中点灯、書き込み終了で消灯くらいだけど。
#define BOOTLOADER_BUTTON               BSP_BUTTON_3                                            /**< Button used to enter SW update mode. */
#define UPDATE_IN_PROGRESS_LED          BSP_LED_2                                               /**< Led used to indicate that DFU is active. */
    
    //For BLENano
#undef UPDATE_IN_PROGRESS_LED
#undef LED_START
#undef LED_STOP
#undef LEDS_MASK
#define UPDATE_IN_PROGRESS_LED          (19)//P0_19 BLENano本体のLED.  
#define LED_START   (19)
#define LED_STOP    (19)
#define LEDS_MASK   (1<<19)
```
4. ビルド `[F7]`<br>=> `_build/nrf51422_xxac.hex` ってのができる
5. SoftDeviceのHEXとマージする

    ```bat
    rem プロジェクトのあるフォルダに移動して.
    cd C:\BLE\nRF51_SDK_10.0.0_dc26b5e\examples\dfu\bootloader\pca10028\dual_bank_ble_s110\arm5_no_packs\
    rem　HEXマージ => OUT_DFU_BL.HEXができる。
    "C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin\mergehex.exe" -m ..\..\..\..\..\..\components\softdevice\s110\hex\s110_nrf51_8.0.0_softdevice.hex _build\nrf51422_xxac.hex -o OUT_DFU_BL.HEX
```
6. `OUT_DFU_BL.HEX`を焼いて起動して、スマホのBLEアプリ(`nRF Connect`)とかで検索かけてみると、`DfuTarg` というのが見える

### テスト - `nRF Tools`についてきてる、サンプルファームウェアでアップデート
1. nRF Toolsを開く
2. `DFU`
3. `Select File`を押して、`hrs_dfu_s110_8_0_sdk_8_0.zip`を選択して、右上の `Done`
4. `[SELCT DEVICE]`をおして、`DfuTarg`ってのを選択
5. 真ん中辺りにある`Upload`を押すと、アップロードが始まる
<br>![IMG_5868.PNG](https://qiita-image-store.s3.amazonaws.com/0/75594/74583b13-b8d7-b01a-9413-1774829aa4a1.png)
6. nRF Toolsのトップメニューから、`HRM` => `[CONNECT]`からデバイス選択。`Nordic_HRM`(名前は、`DfuTarg`のままかもしれないけど、スマホがキャッシュしてる??)
7. さらに、DFUで、`Nordic_HRM`を選択して、アップグレードできる
<br>![IMG_5869.PNG](https://qiita-image-store.s3.amazonaws.com/0/75594/d2ff09c6-f138-f49e-65db-9396a1ce7be5.png)


### 自作のアプリケーションでのzipパッケージ作成
- `nrfutil.exe`を使って、zipのパッケージを作る。

    ```txt:例
nrfutil.exe dfu genpkg application.zip --application dfu_test_app_hrm.hex --dev-revision 0xffff --dev-type 0xffff --sd-req 0x0064
```


## その他
1. プロジェクトの種類
 

    ```txt:nRF51_SDK_10.0.0_dc26b5e\examples\dfu\bootloader\pca10028
dual_bank_ble_s110
dual_bank_ble_s130
dual_bank_ble_s310
dual_bank_serial_s110
dual_bank_serial_s130
dual_bank_serial_s310
single_bank_serial_s110
single_bank_serial_s130
single_bank_serial_s310
```
    - ble/serial : BLEのOTA経由 / シリアルケーブル経由　
    - s110/s130/s310 : SoftDeviceの違い
    - dualとsingle bank: (図はNordicのページへリンク) [=>参照](http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk51.v10.0.0%2Fbledfu_memory_banks.html&cp=6_0_1_4_3_1_3_1)
<table>
<thead>
<tr>
<th>Dual</th>
<th>Single</th>
</tr>
</thead>
<tfoot>
<tr><td colspan="2" align='center'>Flashのメモリマッピングの違い<br>(アドレスはS110v8.0だとちょいと違ったはず)</td></tr>
</tfoot>
<tbody>
<tr>
<td><img src="https://devzone.nordicsemi.com/documentation/nrf51/4.4.1/html/ble_app_dfu_banked_memory.png" height="512"alt="DualBank">
</td>
<td><img src="https://devzone.nordicsemi.com/documentation/nrf51/4.4.1/html/ble_app_dfu_full_memory.png" height="512"alt="SingleBank"></td>
</tr>
</tbody>
</table>
ということは、Dualだと、
    - アプリケーションに使える領域は半分！？ 
    - 新しいファームウェアのをSwapのところに読み込んで、それから、アップデートするので安全。
    - (BLE(OTA)は、Dualのみ?)

2. 同様にシリアルケーブル経由でのnRFgo Studioからアップデートもできる。
![nRFgoStudio_nRF5xBootloader.png](https://qiita-image-store.s3.amazonaws.com/0/75594/3fe56ece-3ebc-a5d5-4757-b74f1e224570.png)　
ソースは、Pythonででてた。Cに移植して、Cortex-M3ベースのホストからアップデートというのもできた。