[nRF52] 6. Secure bootloader & OTA DFU

Dongsik·2022년 5월 11일
0

목적

  • DFU를 위해서는 bootloader 가 필요하다.
  • OTA DFU 를 적용하겠다.
  • Cybersecurity 를 확보하기 위해 secure bootloader 를 이용한다.

Git

https://github.com/tlaehdtlr/nrf52_ble_base

  • 21 commit : [Feat] Add bootloader and adjust memory section
  • 22 commit : [Feat] enable log via uart in bootloader

1. Secure bootloader

1-1. 코드 생성 및 포팅

  • nRF5_SDK_17.0.0_9d13099\examples\dfu\secure_bootloader\pca10100_s140_ble 의 예제 코드를 이용하여 secure bootloader 를 만들자

  • 메모리 설정 (bootloader, application, softdevice)

    • Flash (22 commit 기준)
      • Bootloader settings : 0x0007 F000 (0x1000)
      • mbr params : 0x0007 E000 (0x1000)
      • Bootloader : 0x0007 2000 (0xC000)
      • Application : 0x0002 7000 (0x4B000)
      • Softdevice : 0x0000 0000 (0x27000)
    • RAM
      - bootloadeer 의 RAM start 가 softdevice 영역을 침범하지 않기 때문에 수정하지 않아도 될 것 같다. (ble dfu 사용하면 고려할 점이 어떤 것인지 아직 잘 모르겠다.)
  • 이참에 프로젝트의 board 도 custom board 로 바꿔주자. (bootloader는 버튼 잠시 쓸거라 pca10100)

  • micro_ecc_lib_nrf52.a library 도 준비해야한다.

    ~\nRF5_SDK_17.0.0_9d13099\external\micro-ecc 에서 build_all.bat

  • commit 21 의 결과를 nrf connect 의 programmer 로 확인하면 밑의 그림과 같다. (시각적으로 메모리 영역을 보여주기 위한 그림이고, bootloader setting file 이 없어서 application 으로 주소를 못 옮긴다.)


1-2. Log enable

  • Bootloader 가 무슨 짓을 하는지 알기 위해 nrf_log, Uart 를 활용하고자 한다.
    • xml 파일을 수정하여 메모리에 nrf_log_backend 를 할당해줘야한다. (이때 삽질 좀 하게 된다...ㅂㄷㅂㄷ 문제는 해결했지만 궁금한 점이 있어 Devzone 에 문의를 남겼다. 도움은 되지 않았다.)
    • bootloader flash 영역도 넓혀주자.

1-3. Generate keys

  • nrfutil 이용하여 키쌍 만들기 (실제 프로젝트가 아니라서 private 키를 숨기지 않고 git 에 올렸더니 똑똑한 git 이 경고를 줬다.)

    nrfutil keys generate base_private.pem

    nrfutil keys display --key pk --format code base_private.pem --out_file base_public_key.c

1-4. settings file, merge, zip file

1) settings file

  • booloader 실행 후, application 영역으로 jump 하기 위해 필요하다.
    • 참고1을 보면 커맨드 각 인자에 대한 설명이 있다.

      nrfutil settings generate --family NRF52 --application my_base_ble.hex --application-version 1 --bootloader-version 1 --bl-settings-version 2 base_settings.hex

2) merge

  • bootloader, softdevice, application, settings file 을 합치자

    mergehex -m my_base_ble.hex my_base_bootloader.hex s140_nrf52_7.0.1_softdevice.hex base_settings.hex -o base_merged.hex

3) zip

  • DFU 하기 위한 zip file 생성

    nrfutil pkg generate --hw-version 52 --sd-req 0xCA --application-version 1 --application my_base_ble.hex --key-file base_private.pem base_dfu_package.zip

    • softdevice 의 버전 정보를 알아야한다. (나의 경우는 0xCA)

      nrfutil pkg generate --help

1-5. 결과

원래 Bootloader 와 OTA DFU 에 대해서도 깊이 있게 다루고자 하였으나 자르고 갈 필요를 느꼈다. secure bootloader, log, OTA DFU 정상 동작하는 것까지만 확인하였다.
(ToDo : Customizing bootloader, handling error of DFU)

devzone 을 통해 현재 SDK 17.0.0 버전에서 업그레이드해라는 조언을 받아서 이걸 먼저 해볼까 고민 중이다... (코드는 그렇다쳐도 포스팅 내용들은 어떻게 해야좋을지;)


2. 참고

memory usage

Application 부분이 바뀌는게 없어서 굳이 남길 필요가 없을 듯하다. (flash 가 220.3 KB 가 되었긴하다.)

2-1) Nordic의 secure bootloader 튜토리얼

2-2) OTA DFU 시퀀스에 대해 설명들이 많다.

2-3) Bootloader, DFU 모듈에 대한 설명들

2-4) 궁금점이 생겨 처음으로 nordic devzone에 문의하였다.

profile
There is a plenty of room at the bottom.

0개의 댓글