[NRF52] Bootloader and DFU modules - Device Firmware Update process(Dual-bank and single-bank update)
장치 펌웨어 업데이트를 안전하게 수행하기 위해 새 펌웨어 이미지가 검증될 때까지
메모리의 최종 위치에 복사되지 않는다. 이렇게 하면 완전하고 유효한 이미지만 활성화된다.
전송중에 오류가 발생하면 펌웨어가 업데이트되지 않고 이전 펌웨어를 계속 사용할 수 있다.
수신된 펌웨어를 여유 메모리에 저장한 다음 활성화하는 동안 의도한 메모리 위치에 복사하는
이 프로세스를 이중 뱅크 업데이트라고 한다. 이중 뱅크 업데이트는 새 펌웨어가 확인되고 활성화
될 때까지 현재 응용 프로그램이 유지되기 때문에 선호되는 펌웨어 업데이트 방법이다.
이중 뱅크 업데이트는 현재 어플리케이션의 끝과 어플리케이션 데이터의 시작 사이에 새 펌웨어 이미지를
저장할 충분한 여우 공간이 있는 경우에만 가능하다. 새 펌웨어 이미지가 사용 가능한 공간보다 큰 경우
단일 뱅크 업데이트로 전송해야 한다. 이 과정에서 펌웨어 이미지가 기존 어플리케이션을 덮어 쓴다.
단일 뱅크 업데이트 중에 오류가 발생하면 장치에 유효한 어플리케이션이 남지 않는다.
이 경우 장치는 부트로더에서 DFU 모드를 유지하고 펌웨어 업데이트 프로세스를 다시 시도할 수 있다.
NRF_DFU_SINGLE_BANK_APP_UPDATES가 설정된 경우 단일 뱅크 업데이트로 우선적으로 수행된다.
그렇지 않으면 모든 펌웨어 업데이트가 이중 뱅크 업데이트로 수행된다. 그러나 새 이미지(SoftDevice,
SoftDevice 및 부트로더 또는 어플리케이션)가 사용 가능한 공간보다 큰 경우 펌웨어 이미지를 위한 공간을
만들기 위해 어플리케이션이 삭제되고 단일 뱅크 업데이트가 수행된다.
안전상의 이유로 DFU 구성에서 단일 뱅크 업데이트를 비활성화할 수 있다.(NRF_DFU_FORCE_DUAL_BANK_APP_UPDATES참조) 그러나 단일 뱅크 업데이트를 비활성화하면
어플리케이션과 예약된 어플리케이션 데이터 사이의 여유 페이지로 업데이트할 수 있는 크기가 제한된다.
이 여유 공간은 SoftDevice와 부트로더를 결합한 업데이트에 충분하지 않을 수 있다.
1. Dual-bank updates
이중 뱅크 업데이트 중에는 새 펌웨어 이미지가 활성화 될 때까지 기존 어플리케이션이 유지된다.
펌웨어 업데이트 프로세스가 실패하더라도 장치를 재부팅하여 기존 어플리케이션을 시작할 수 있다.
SoftDevice의 끝과 어플리케이션 데이터의 시작 사이 메모리영역은 두 개의 뱅크로 나누어진다.
Bank0은 기존 어플리케이션을 보유하고 Bank1은 수신된 이미지를 저장하는데 사용된다.
1.1 SoftDevice and bootloader
다음 그림은 부트로더와 SoftDevice가 결합된 이미지에 대한 DFU 프로세스를 보여준다.
전송된 이미지에 SoftDevice 또는 부트로더만 포함된 경우 일반 프로세스는 동일하지만
SoftDevice 또는 부트로더만 교체된다.
전송된 이미지는 여유 메모리 영역에 저장된다. 기존 어플리케이션 데이터를 유지할 수 있다.
자세한 내용은 Preserving application data을 참조한다. 유효성 검사 후 새 SoftDevice 및
새 부트로더가 복사되어 기존 펌웨어를 대체한다.
어플리케이션은 이 프로세스동안 유지되지만 SoftDevice의 API변경 또는 새 SoftDevice의 크기가
기존 것과 다르기 때문에 유효하지 않을 수 있다.
1.2 Application
이중 뱅크 업데이트에서 어플리케이션을 업데이트할 때 기존 어플리케이션은 유지된다.
원본 어플리케이션은 메모리 Bank0에 있다. 전송된 이미지는 Bank1에 저장된다. 새 어플리케이션 이미지가
수신된 후 이전 어플리케이션과 새 어플리케이션이 모두 존재한다.
이렇게하면 새 어플리케이션을 활성화할 수 없는 경우 이전 어플리케이션으로 대체할 수 있다.
새 어플리케이션을 활성화 할 수 있으면 Bank1에서 Bank0으로 복사된다.
기존 어플리케이션 데이터는 유지할 수 있다. 자세한 내용은 Preserving application data을 참조한다.
2. Single-bank updates
단일 뱅크 업데이트에서는 기존 어플리케이션이 새 펌웨어 이미지로 대체된다.
오류가 발생하고 장치에 유효한 어플리케이션이 없으면 시스템이 DFU모드로 돌아가고 업데이트
프로세스를 다시 시작할 수 있다.
DFU부트로더는 이중 뱅크 업데이트가 가능한지 확인한다.
그렇지 않은 경우에만(여유 메모리가 충분하지 않기 때문에) 단일 뱅크 업데이트로 되돌아간다.
기존 어플리케이션 데이터를 유지할 수 있다. 자세한 내용은 Preserving application data을 참조한다.
2.1 SoftDevice and bootloader
다음 그림은 단일 뱅크 모드의 어플리케이션에 대한 DFU 프로세스를 보여준다.
새 펌웨어 이미지를 위한 공간을 만들기 위해 기존 어플리케이션이 지워진다. 유효성 검사 후 새 SoftDevice 및
새 부트로더가 복사되어 기존 펌웨어를 대체한다. 마지막으로 장치가 다시 시작되고 DFU 모드로 들어간다.
(장치에 유효한 어플리케이션이 없기 때문에)
2.2 Application
다음 그림은 단일 뱅크 모드의 어플리게이션에 대한 DFU 프로세스를 보여준다.
새 어플리케이션 이미지를 위한 공간을 만들기 위해 기존 어플리케이션이 지워진다. 전송이 완료되면 부트로더가
새 어플리케이션의 유효성을 검사한다. 유효한 경우 부트로더가 활성화한다. 유효하지 않으면
부트로더가 Reset되고 DFU 모드에서 시작되며 새 이미지가 업로드 될 깨까지 기다린다.
3. Preserving application data
장치 펌웨어 업데이트 동안 유지해야 하는 어플리케이션 데이터(예:본딩정보, 시스템 속성 또는 어플리케이션이
Reset 되는 동안 보존하려는 데이터)는 부트로더가 시작되기 직전에 어플리케이션과 부트로더 사이의
특정 메모리 영역에 저장해야 한다. 이 SDK에서 제공하는 예제가 Peer Manager 데이터를 저장하는 기본 위치이다.
DFU동안 어플리케이션 데이터를 보존하려면 nrf_dfu_types.h에서 DFU_APP_DATA_RESERVED에 대한 값을
구성한다. 기본값은 3이다.
#define DFU_APP_DATA_RESERVED CODE_PAGE_SIZE * 3
값은 페이지 크기의 배수이어야 한다. 예를 들어 페이지 크기가 0x1000인 경우 0x1000, 0x2000, 0x3000 등이다.