nRF5 SDK 부트 로더와 DFU moudles (1)

임베디드 운영 체제에서, 부트 로더가 실행하는 운영 체제 커널 전에 실행됩니다. 하드웨어 장치, 올바른 환경에 대한 준비가 운영 체제 커널에 최종 호출 위해서는 적절한 상태를 가져올 것이다 메모리 공간의지도, 시스템 하드웨어 및 소프트웨어 환경의 설립을 초기화 할 수 있습니다.

임베디드 시스템에서 일반적으로 내가 BIOS 펌웨어의 종류 좋아하지 않는다 (참고, 일부 임베디드 CPU는 짧은 시작 프로그램을 위해 만들어진 것) 때문에 전체 시스템이 완전히 부트 로더에 의해 수행 작업을 시작로드됩니다. ARM7TDMI 코어 기반의 임베디드 시스템에서, 시스템은 일반적으로 파워 업에서 시작하거나 어드레스 0x00000000의 리셋 및 어드레스이 배치는 일반적으로 시스템 부트 로더 프로그램이다.

부팅 과정

대부분의 시작 부트 로더는 두 단계로 나누어진다.

첫 번째 단계는 하드웨어 초기화 코드는 일반적으로 어셈블리 언어, 시스템의 CPU의 구조에 의존 포함한다. 이 단계에서의 작업은 다음과 기본적인 하드웨어 초기화는 (모든 인터럽트는 프로세서 내부 명령 / 데이터 캐시 등을 개폐 마스크된다). RAM 공간은 두 번째 단계를 준비합니다.

두 번째 단계에서 코드는 고체 상태 기억 매체의 경우, 부트 로더의 복사본이 RAM으로.
스택을 설정합니다.
이 캐시를 종료 한 이유 첫 번째 단계에서? 캐시는 일반적으로 사용되며, 쓰기 버퍼는 시스템 성능을 개선하는 것입니다,하지만 사용은 캐시 액세스 메인 메모리, 형식과 시간의 수를 다를 수 있습니다, 따라서 부트 로더는 일반적으로 필요하지 않습니다.
C 프로그램은 두 번째 단계의 진입 점으로 이동합니다.
두 번째 단계는 일반적으로 더 복잡한 기능을 달성 할뿐만 아니라 프로그램의 가독성과 휴대 성을 만들기 위해, C 언어로 이루어집니다. 임무의이 단계가 있습니다 :
이 단계를 초기화하는 하드웨어 장치로 사용할 수 있습니다.
탐지 시스템 메모리 맵.
커널 이미지와 루트 파일 시스템 이미지를 RAM 플래시에서 읽습니다.
커널 설정 매개 변수.
커널 호출.


첫 번째 단계의 부트 로더 소프트웨어 코드는 부트 로더라고, 전력 시스템 후에 실행됩니다. 부트 로더는 부팅 프로그램과 로더를 공동 집필 : 전자 수단은 그것을 적어도 부분적까지, 실행 및 실행, 그리고 PC의 BIOS의 역할과 유사하게 임베디드 시스템 하드웨어를 초기화하려면, 임베디드 운영 체제 이미지에로드됩니다 후자의 수단 메모리, 실행하고 과거에 점프.

부트 로더 하드 디스크는 MBR 시스템 RAM을 읽고 다음 OS 부트 로더로 제어를 전송합니다. 부트 로더의 주요 작업은 RAM에서 하드 디스크에서 읽어 커널 이미지를 실행하는 것입니다 다음 운영 체제를 시작하는 실행 커널 엔트리 포인트로 이동합니다.


감시 호출 감시 타이머 , 타이머 회로는 일반적으로 입력이, 개 (개 개 / 서비스 발로 불렀다 ) 간격으로 상기 MCU 정상 동작 시간 MCU의 RST 출력 단자 , WDT 타이머가 초과, 상기 MCU는 재설정 MCU에 리셋 신호를 제공 소정의 시간 (일반적으로, 프로그램 실행 중) 개 먹이 이하인 경우 개는 WDT에 종료 시간에 신호가 클리어 출력한다. MCU는 충돌을 방지한다. 감시 역할은 무한 루프의 발생 프로그램, 또는 프로그램의 실행을 방지하기위한 것이다.


마스터 부트 레코드 ( MBR을, 녹음 부트 마스터 ) 가이드 디스크 (로더) 코드의 가장 앞 부분에 위치하고 있습니다. 이 하드 디스크는 디스크 운영 체계 (DOS)에 의해 초기화 될 때 생성되는 디스크 운영 체계 (DOS) 읽기 및 쓰기 디스크의 파티션의 적법성을 결정, 파티션 부트 위치 정보에 대한 책임이 있습니다.


 펌웨어 (펌웨어)는 일반적으로 리프레시 절차를 업그레이드 할 특정 프로그램을 통해 일반적으로 사용자에 의해, 전기 장치의 EEPROM EEPROM (전기적 소거 프로그램 가능 ROM) 또는 플래시 칩에 저장된다. 일반적으로, 작품의 소프트웨어 낮은 수준은 같은 컴퓨터의 마더 보드 / 출력 시스템 BIOS (기본 입 / 출력 시스템)에 기본 입력으로, 펌웨어를 호출 할 수 있습니다 대부분의 디지털 제품에 대한 기준을 역임 , 과거의 사실,보다 전문 사람들은 펌웨어 호출합니다.


 

북유럽 문서 요약

(부트 로더) 부트 로더 모듈은 책임이 있습니다 :

  • 응용 프로그램을 시작,
  • 새 펌웨어를 활성화,
  • 또한, DFU 모드를 입력하고 새로운 활성화 DFU 펌웨어 전송을 보내,
  • 워치 독 타이머를 먹이

부트 로더 설정 페이지
부트 로더와 DFU의 정보를 저장하기위한 비 휘발성 메모리 페이지 (메모리의 레이아웃을 참조). 설정 페이지에는 다음과 같은 정보가 포함

  • 현재 펌웨어 - 크기, CRC-32,
  • 펌웨어 보류 - 크기, CRC-32,
  • 진보의 펌웨어 업데이트,
  • 진보의 펌웨어 활성화,
  • 현재 펌웨어 버전 (응용 프로그램과 부팅 프로그램)
  • 특정 데이터 전송.

펌웨어 활성화
코드 활성화는 펌웨어 업데이트 과정의 마지막 단계입니다. 시작시 읽기 활성화 설정 페이지를 트리거에 따르면. 펌웨어 펌웨어 활성화는 출구를 교체하고 새 펌웨어 시작을 허용하도록 설정 페이지를 업데이트 할 새 펌웨어를 복사하는 것을 포함한다 . 복제를 보장 할 수 부트 로더는 정전 안전합니다. 부트 로더를 업데이트하는 경우, 전원을 수행하기위한 MBR 기능은 복제 (SD_MBR_COMMAND_COPY_BL)를 실패합니다.

 

모드 DFU (디바이스 펌웨어 업그레이드)
DFU 모드, 부트 로더 DFU 전송 활성화에이 장치는 새로운 펌웨어를 수신 할 준비가 된 것입니다. 다음과 같은 조건에서 DFU 모드로 부트 로더 :

  • 유효한 응용 프로그램이 없습니다.
  • SoftDevice已激活,并且存在有效的应用程序。在这种情况下,引导加载程序期望主机可以请求应用程序更新。
  • 进入DFU模式由其中一个可选来源触发:
    • 按钮(NRF_BL_DFU_ENTER_METHOD_BUTTON)
    • 引脚复位(NRF_BL_DFU_ENTER_METHOD_PINRESET)
    • GPREGRET寄存器中的特殊值(NRF_BL_DFU_ENTER_METHOD_GPREGRET),
    • 从写入设置页面的应用程序请求(NRF_BL_DFU_ENTER_METHOD_BUTTONLESS)。

进入DFU模式后,将启动不活动计时器。在计时器到期时,引导加载程序将重置。在任何DFU活动上重新启动不活动计时器。默认情况下,不活动超时设置为NRF_BL_DFU_INACTIVITY_TIMEOUT_MS。如果在SoftDevice激活后进入DFU模式,则超时设置为NRF_BL_DFU_CONTINUATION_TIMEOUT_MS。

启动应用程序
根据设置页面中的信息,引导加载程序确定应用程序是否存在以及它位于何处。 引导加载程序在启动之前检查应用程序的完整性。 可选地,在某些情况下可以跳过完整性检查以减少启动时间(NRF_BL_APP_CRC_CHECK_SKIPPED_ON_GPREGRET2,NRF_BL_APP_CRC_CHECK_SKIPPED_ON_SYSTEMOFF_RESET)。 如果出现下列情况之一,则引导加载程序进入DFU模式:

  • 没有安装应用程序,
  • 完整性检查失败,
  • 没有设置页面。

编程引导加载程序
在系统启动期间,如果安装了引导加载程序,则主引导记录(MBR)负责启动引导加载程序。 为此,MBR必须知道引导加载程序的起始地址。 此起始地址在MBR本身或UICR.BOOTLOADERADDR中定义。 编程引导加载程序时,必须将其设置为正确的值。 有关更多详细信息,请参阅S132 SoftDevice规范。

对引导加载程序进行编程需要执行以下步骤:

  • 擦除设备。
  • 编写SoftDevice。 有关说明,请参阅编程SoftDevices。
  • 编译引导加载程序。
  • 编程引导加载程序并写入UICR.BOOTLOADERADDR。 有关Segger Embedded Studio,Keil,IAR和nrfjprog的说明,请参阅以下部分(如果您使用的是GCC)。

 设备固件更新过程

执行设备固件更新需要两个设备:DFU目标和DFU控制器。 DFU目标是使用新固件映像更新的设备,该固件映像可以包含新应用程序,SoftDevice,引导加载程序或SoftDevice和引导加载程序的组合。 DFU控制器是传输镜像的设备。 例如,DFU控制器可以是运行app的移动电话,也可以是与nrfutil一起使用的nRF5开发套件。

DFU目标是运行具有至少一个活动DFU传输的DFU的设备。 它可以是DFU模式下的引导加载程序,也可以是后台运行DFU的应用程序(DFU over TFTP示例)。 然后,DFU控制器可以启动固件映像的传输,该固件映像由DFU目标接收和验证。 如果映像有效,则设备将重置,引导加载程序将激活映像以替换现有固件。 根据映像的类型,它可能会替换应用程序,SoftDevice,甚至是接收更新的当前引导加载程序。 有关图像存储位置及其复制方式的详细信息,请参阅双库和单库更新。

作为DFU控制器,您可以使用以下Nordic工具:

  • nrfutil (version 2.2.0 or later)
  • nRF Connect for Desktop
  • Nordic's mobile apps, such as nRF Connect for Mobile.

以下流程图显示了必须在DFU目标中实现的固件更新所需的步骤:

 

固件更新过程的事件和过程与所使用的传输协议无关。 DFU模块包含BLE,UART和USB CDC的实现(请参阅DFU协议)。 DFU控制器可以通过在DFU传输上发送相应的消息来触发事件。

DFU程序

nrfutil工具生成一个包含一个或两个更新的zip文件(请参阅使用nrfutil创建固件包)。 单个更新包含具有新固件详细信息和二进制数据的init数据包。 DFU控制器发送init数据包并等待DFU目标的确认。 DFU目标验证init数据包并以结果响应。 成功验证后,DFU控制器发送二进制数据。 一旦DFU目标接收到二进制数据,就会执行后验证。 成功验证后,DFU目标将重置,引导加载程序将激活新固件。 如果zip文件包含两个更新,则DFU控制器期望DFU目标进入DFU模式并尝试通过建立连接并发送第二个init数据包来执行第二次更新。 从DFU控制器应用程序的用户的角度来看,即使以两个步骤执行,这种更新也被视为单个更新。

单个更新可能包含以下元素:

  • 应用程序,
  • 一个SoftDevice,
  • 引导程序,
  • 引导程序和SoftDevice。

如果update必须包含应用程序和SoftDevice(以及引导加载程序),则zip包中包含两个更新。 如果引导加载程序依赖于Softdevice(请参阅Bootloader依赖项),则包含Softdevice update的软件包可能包含引导加载程序。

完成第一步后,激活新的SoftDevice(和引导加载程序),应用程序可能仍然有效但由于SoftDevice依赖性损坏而无法运行。 必须在第二步中更新它。 使用SoftDevice激活软件包后,引导加载程序将进入期望应用程序更新的DFU模式。 由于应用程序更新是可选的(在SoftDevice次要版本更新后不需要),因此引导加载程序中的不活动超时设置为与默认值(NRF_BL_DFU_CONTINUATION_TIMEOUT_MS)不同(更短)的值。

 

추천

출처www.cnblogs.com/ustc-anmin/p/11303096.html