티스토리 뷰

반응형

임베디드 기기에 개발을 하다보면 작성한 코드를 업데이트 해야합니다. 업데이트 한다는 개념은 임베디드 기기의 Rom 과 같은 비휘발성 메모리에 코드를 적재하고, 부팅시 Ram에 로드 시키고, 스타트어드레스부터 순차적으로 실행하게 되는데요. 개발할때는 UART, SPI, JTAG 등 여러가지 방법으로 각자의 개발 환경에 따라서 PC에서 유선으로 직접 업데이트를 할 수 있습니다. 하지만, 고객들은 어떻게 할까요? 이어폰도 무선이어폰이 대중화된 시대에 당연히 이런 업데이트는 무선으로 되도록 기술은 발달해 있습니다. TV나, 핸드폰 등 대부분은 인터넷을 통해 업데이트가 필요한지 체크하고 이를 다운받아서 자동으로 업데이트 하는 개념이지요. 오늘은 그러한 기술의 핵심인 OTA를 노르딕 칩인 nRF에서 어떻게 할 수 있는지 확인하고, 따라해 보도록 하겟습니다.

OTA (Over The Air) DFU (Device Firmware Upgrade)

공기중으로 Device 를 업그레이드 할 소프트웨어를 전송해서 이를 업데이트 해야하는데요. 공기중으로 전송하는 방식은 꼭 WIFI나 인터넷이 아니어도 상관없습니다. 우선 아래와 같이 조금 나눠 보겠습니다.

업데이트 과정

  1. 사용하는 기기의 소프트웨어의 최신 버전이 특정 서버에 있는지 확인
  2. 현재 디바이스의 소프트웨어 버전을 확인해서 최신 버전이 아닐 경우 업데이트 여부 확인
  3. 업데이트 요청시, 서버로 부터 업데이트 할 소프트웨어 받아 옴
  4. 사용하는 기기에 업데이트 할 최신 소프트웨어 전송
  5. 소프트웨어 업데이트 후, 기기 리붓

위와 같은 순서로 진행하는데, 사용하는 기기 자체가 서버에 접속해서 최신의 소프트웨어가 올라와 있는지 확인 할 수도 있지만, 그러기 위해선 사용하는 기기가 WIFI 등의 인터넷이 연결된 상태여야 가능하므로, Bluetooth 방식으로 별도의 클라이언트인 PC나 핸드폰으로 최신 소프트웨어가 있는지 확인 하는 것을 가정합니다.

그럼 이제 OTA 라는 방식으로 nRF 칩에 업데이트 하기에 위해서는 어떻게 해야할 까요? 다행히 nRF의 SDK 단에서 이를 쉽게 할 수 있는 방법을 지원하고 있습니다. 만약 이런 OTA 기능을 자체적으로 구현하기 위해서는 상당히 많은 개발과 검수 과정이 필요합니다. 만약 업데이트를 하다가 잘못되면 기기를 영영 복구를 못할 수 도있고, 그동안 저장되어 있던 데이터가 남아있다면 그런 데이터를 날릴 수도 있으니까요. 그래서 만약 업데이트 모듈이 없다면 신중하게 개발과 확인을 한 뒤 진행하시고, nRF 처럼 SDK를 지원한다면 이를 이용하는 것이 최선일 것 같습니다.

노르딕의 OTA 기능

검새글 통해 보면 nRF 칩에서 사용하는 SDK v12.0 부터 기능이 들어 갔다고 나와 있습니다. 지금이 v17 대의 SDK가 릴리즈 되고 있으니, 상당히 안정화가 되었을거라 보고, 기본적으로 업데이트하는 과정은 암호화가 필요하며, 실패했을때 리커버리등을 주요 포인트로 잘 설명해주고 있습니다. 무엇보다, nRF 칩에 올라가는 소프트웨어는 부트로더/soft devie/application/settings 등으로 나눌 수 있는데, 한번에 다 올릴수 있고 각각 올릴 수도 있다고 설명되어 있으며, 레퍼런스 앱도 제공해서 직접 앱을 개발하지 않아도 테스트가 가능하며 직접 개발 할 수 있도록 nrf-toolbox라는 앱 코드를 android와 iOS 용 각각 공개하고 있습니다.

- Android : https://github.com/NordicSemiconductor/Android-nRF-Toolbox

 

GitHub - NordicSemiconductor/Android-nRF-Toolbox: The nRF Toolbox is a container app that stores your Nordic Semiconductor apps

The nRF Toolbox is a container app that stores your Nordic Semiconductor apps for Bluetooth Low Energy in one location. - GitHub - NordicSemiconductor/Android-nRF-Toolbox: The nRF Toolbox is a cont...

github.com

- iOS : https://github.com/NordicSemiconductor/IOS-nRF-Toolbox

 

GitHub - NordicSemiconductor/IOS-nRF-Toolbox: The nRF Toolbox is a container app that stores your Nordic Semiconductor apps for

The nRF Toolbox is a container app that stores your Nordic Semiconductor apps for Bluetooth Low Energy in one location. - GitHub - NordicSemiconductor/IOS-nRF-Toolbox: The nRF Toolbox is a containe...

github.com

이 정도면 굉장히 직접 만들 nRF칩 기반의 기기의 OTA DFU에 대한 기능을 쉽게 추가 할 수 있을 것 같습니다. 

업데이트를 위한 Bootloader

nRF 칩에 OTA 기능이 enable 되게 하기 위해서 가장 중요한 것은 bootloader의 개발입니다. 물론 이러한 bootloader 또한 예제로 제공하고 있고 open bootloader와 secure bootloader 이렇게 나눠서 제공합니다. 부트로더를 secure한걸 쓰지 않는다면 디바이스에 누구나 접근해서 소프트웨어를 업데이트하고 파괴할 수 있으니 저는 secure bootloader를 선택해서 이를 기반으로 진행하도록 하겠습니다. 아참, 최근에 지금까지 개발의 베이스가 된던 nrf52810 대신 nrf52832로 변경했습니다. 칩의 가격차이는 분명하지만 제가 진행하는 프로젝트의 기능을 모두 담고 유연하게 동작하기에 nrf52810은 숨이 턱턱 막히는 반면 nrf52832는 여유롭거든요. 또한 핀맵이 같기때문에 현재 만든 회로에도 큰 무리없이 변경이 가능했습니다. nrf52832에는 freeRTOS도 올려서 개발을 진행하고 있습니다. 따라서 부트로더도 nrf52832용으로 예제를 선택해서 준비하도록 하겠습니다.

SDK 내에서 example 를 보면 아래와 같이 dfu 라는 폴더를 보실 수 있습니다.

dfu 폴더에 들어가면 오픈 부트로더와, 시큐어 부트로더를 볼 수 있구요.

secure_bootloader를 열어보도록 하겠습니다. 열어보기 전에 dfu_public_key.c 도 잠시 먼가 한번 들여다보고 갈게요. 아래와 같은 형태로 헥사값들이 적혀져 있습니다.

아마도 이 값을 자신이 빌드하는 PC에서 생성해서 이곳에 넣고 소프트웨어를 만들어야 업데이트 되는 구조로 생각이됩니다. 자 이제 다시 secure booloader를 살펴 볼까요?

굉장히 많은 폴더들이 있습니다. debug가 붙은거는 먼가 debug가 되는 용도로 보이고, uart가 붙은거는 uart로 dfu 가 가능한거고, 우리는 OTA 즉, 무선으로 가능하게 하기위해서 ble가 붙은거를 찾고 52832용 부트로더는 pca10040 이고 52832 는 softdevice를 s132를 사용하고 있으므로 pca10040_s132_ble 나 pca10040_s132_ble_debug를 사용해보도록 하겠습니다. 참고로 52810은 s132를 지원하지 않고 pca10040e 로 시작하는 부트로더 예제를 사용해야합니다.

이전의 52810 led blinky application 을 이클립스 프로젝트화해서 빌드 한 글을 작성한 적이 있는데요, 이번에는 너무 세세히 적지 않고, 제가 필요한 것들만 폴더를 allocation 제방식대로 해서 더 필요한 내용에 대해서 적어보도록 하겠습니다. 우선 필요한건 s132 soft device이기 때문에 SDK 에서 미리 위치를 확인해둡니다. makefile를 준비하고 main.c를 빌드할 수 있게끔 수정한뒤 dfu_public_key.c도 현재 예제 폴더 안에 있는거로 일단 위치해 두도록 하겠습니다. 기본 구성을 다 했다면 빌드를 해보겠습니다.

첫 번째 빌드 에러

1:07:30 **** Incremental Build of configuration Default for project nrf_bootloader ****
make all 
Makefile:241: Cannot find include folder: ./lib/SDK/nRF5_SDK_17.1.0_ddde560/external/micro-ecc/micro-ecc
Compiling file: micro_ecc_backend_ecc.c
In file included from ./lib/SDK/nRF5_SDK_17.1.0_ddde560/components/libraries/crypto/nrf_crypto_ecc_backend.h:58,
                 from ./lib/SDK/nRF5_SDK_17.1.0_ddde560/components/libraries/crypto/nrf_crypto_ecc.h:73,
                 from ./lib/SDK/nRF5_SDK_17.1.0_ddde560/components/libraries/crypto/backend/micro_ecc/micro_ecc_backend_ecc.c:51:
./lib/SDK/nRF5_SDK_17.1.0_ddde560/components/libraries/crypto/backend/micro_ecc/micro_ecc_backend_ecc.h:52:10: fatal error: uECC.h: No such file or directory
   52 | #include "uECC.h"
      |          ^~~~~~~~
compilation terminated.
make: *** [_build/nrf52832_xxaa_s132/micro_ecc_backend_ecc.c.o] Error 1
"make all" terminated with exit code 2. Build might be incomplete.

11:07:30 Build Failed. 3 errors, 0 warnings. (took 492ms)

micro-ecc가 문제라고 하네요. 이게 무엇일지 검색해보도록 하겠습니다.

https://github.com/kmackay/micro-ecc 

 

GitHub - kmackay/micro-ecc: ECDH and ECDSA for 8-bit, 32-bit, and 64-bit processors.

ECDH and ECDSA for 8-bit, 32-bit, and 64-bit processors. - GitHub - kmackay/micro-ecc: ECDH and ECDSA for 8-bit, 32-bit, and 64-bit processors.

github.com

우선 위 깃허브를 sdk 폴더 내에 external 밑 micro-ecc 폴더 바로 아래 클론해서 위치시키고 빌드합니다. 인크립션 모듈이라, 빌드가 안된다면 본인의 개발 환경에 필요한 라이브러리를 설치하고 진행하시면 어렵지 않게 빌드될 수 있습니다. 그리고 나서 make를 수행할 곳을 해서 빌드를 해보록 하겠습니다.

nRF52832 micro-ecc armgcc 빌드를 위한 위치

SDK/nRF5_SDK_17.1.0_ddde560/external/micro-ecc/nrf52hf_armgcc/armgcc

nrf52810 micro-ecc armgcc 빌드를 위한 위치

SDK/nRF5_SDK_17.1.0_ddde560/external/micro-ecc/nrf52nf_armgcc/armgcc

빌드에 필요한 라이브러리 설치를 했다면 정상적으로 빌드되서 'micro_ecc_lib_nrf52.a' 파일이 생성됩니다. Makefile에 해당 파일위치를 연결하고 다시 이클립스에서 프로젝트 빌드를 수행합니다. 정상적으로 빌드가 되네요! 이후 필요한 사항들은 private.key 만들기 등이 있는데 이는 다음 글에서 상세히 정리하도록 하겠습니다.

반응형
댓글