반응형

[nRF5 SDK v16.0.0 기준]

1. Bootloader

부트로더 모듈은 다음을 담당한다.

  • 응용프로그램으로 부팅
  • 새 펌웨어 활성화
  • 선택적으로 DFU 전송을 활성화하고 새 펌웨어가 제공될 수 있는 DFU Mode로 진입
  • Watchdog 타이머 feeding

SDK에 제공된 각각의 부트로더 예제는 하나의 DFU 으로 구성된다.

API에 대한 개요는 Bootloader modules을 참조한다.

2. Bootloader Settings page

비휘발성 메모리의 페이지(Memory layout 참조)는 부트로더 및 DFU 정보를 유지하는데

사용된다. 설정 페이지에는 다음에 대한 정보가 포함되어 있다.

  • 현재 펌웨어 - size, CRC32
  • 보류 중인 펌웨어 - size, CRC32
  • 펌웨어 업데이트 진행 상황
  • 펌웨어 활성화 상황
  • 현재 펌웨어 버전(응용프로그램 및 부트로더)
  • 전송 관련 데이터

3. Firmware activation

펌웨어 활성화는 펌웨어 업데이트 프로세스의 마지막 단계이다. 활성화는 부팅 중에 읽은 설정

페이지의 정보를 기반으로 트리거 된다.

펌웨어 활성화에는 기존 펌웨어 대신 새 펌웨어를 복사하고

(Dual-Bank update의 경우 Dual-bank and single-bank updates 참조)

새 펌웨어를 부팅할 수 있도록 설정 페이지를 업데이트한다.

부트로더는 복사가 전원 fail-safe를 보장한다. 부트로더를 업데이트할 경우

MBR Feature를 사용하여 전원 fail-safe 복사(SD_MBR_COMMAND_COPY_BL)를 수행한다.

4. DFU Mode

DFU 모드에서 부트로더는 DFU 전송을 활성화하고 장치는 새 펌웨어를 받을 준비가 된다.

부트로더는 다음 조건에서 DFU 모드로 진입한다.

DFU모드에 들어가면 비활성 타이머가 시작된다. 타이머가 만료되면 부트로더가 재설정된다.

비활성 타이머는 모든 DFU 활동에서 재시작된다. 비활성 타임 아웃은 NRF_BL_DFU_INACTIVITY_TIMEOUT_MS 로

설정된다. SoftDevice 활성화 후 DFU 모드로 전환되면 타임 아웃은 NRF_BL_DFU_CONTINUATION_TIMEOUT_MS 로

설정된다.

5. Starting the application

설정 페이지의 정보를 기반으로 부트로더는 어플리케이션의 존재 여부와 위치를 결정한다.

부트로더는 시작하기 전에 어플리케이션의 무결성을 확인한다.

선택적으로 부팅시간을 줄이기 위해 무결성 검사를 건너 뛸 수 있다.

(NRF_BL_APP_CRC_CHECK_SKIPPED_ON_GPREGRET2, NRF_BL_APP_CRC_CHECK_SKIPPED_ON_SYSTEMOFF_RESET)

다음의 조건이 발생하면, 부트로더는 DFU 모드로 진입한다.

  • 어플리케이션이 설치되어 있지 않음.
  • 무결성 검사 실패.
  • 설정 페이지가 없음.

6. Watchdog timer support

부트로더는 Watchdog 타이머가 활성 상태인지 감지하고 이를 Feed하여 Watchdog reset을 방지한다.

7. Bootloader dependencies

전송을 제외한 부트로더 모듈은 SoftDevice에 의존하지 않는다. BLE DFU 전송 (BLE 참조)만

SoftDevice에 종속된다.

부트로더는 SoftDevice가 시스템에 전혀 존재하지 않는 경우를 지원한다.

8. Programming the bootloader

시스템 시작 중 MBR(Marster Boot Record)은 부트로더가 설치된 경우 부트로더 시작을 담당한다.

이렇게 하려면 MBR이 부트로더의 시작 주소를 알아야 한다. 이 시작 주소는 MBR 자체 또는

MBR_UICR_BOOTLOADER_ADDR에 정의된다. 부트로더를 프로그래밍할 때 이 값을

올바른 값으로 설정해야 한다. 자세한 내용은 S132 SoftDevice Specification 을 참조한다.

부트로더는 기본적으로 시작 주소를 MBR_UICR_BOOTLOADER_ADDR 에 배치하고,

처음 부팅하는동안 시작 주소를 MBR_BOOTLOADER_ADDR 에 쓴다.

부트로더를 프로그래밍하려면 다음 단계가 필요하다.

  • 장치를 지운다.
  • SoftDevice를 프로그래밍한다.(Programming SoftDevices 지침 참조)
  • 부트로더를 컴파일한다.
  • 부트로더를 프로그래밍한다. Segger Embedded Studio 와 nrfjprog directly(GCC 사용시) 에 대한 지침은 다음을 참조한다.

9. Programming using Segger Embedded Studio

부트로더 응용 프로그램이 플래시 될 때 Segger Embedded Studio에서 SoftDevice 및 UICR을

암시적으로 프로그래밍하므로 추가 작업이 필요하지 않다.

10. Programming using nrfjprog directly

명령줄에서 직접 nrfjprog 를 사용하여 부트로더를 프로그래밍 할 수도 있다.

이렇게 하려면 다음 명령을 실행한다.

nrfjprog --reset --program application.hex --family NRF52 --sectoranduicrerase

"application.hex"를 hex 파일의 이름으로 변경한다.

11. Memory layout

장치에 부트로더를 추가할 때 장치 메모리에서 다른 펌웨어 구성 요소가 있는 위치를 알고 있어야 한다.

다음 표는 현재 SoftDevices가 있는 다양한 칩의 메모리 레이아웃을 보여준다.

다음 그림은 nRF52장치의 기본 메모리 레이아웃을 보여준다. 여기서 nRF52832의 플래시 크기는 512kB, nRF52840의

플래시 크기는 1024kB, nRF52810의 플래시 크기는 192kB, nRF52833의 플래시 크기는 512kB이다.

부트로더의 크기는 장치의 수명동안 고정된다. 부트로더의 시작 주소를 저장하는 위치(MBR_BOOTLOADER_ADDR)를 안전하게 업데이트할 수 없기 때문이다. 자세한 내용은 SoftDevice Specification 을 참조한다.

 

반응형

+ Recent posts