반응형

DFU 프로세스는 신뢰할 수 있는 전송 계층이 사용되는 한 전송에 구애받지 않도록 설계되었다.

DFU 전송 모듈은 각 전송 계층에 대해 구현되어야하는 일반적인 인터페이스를 정의한다.

현재 DFU 전송 모듈은 BLE, UART 및 USB CDC 전송을 지원한다.

 

전송 계층을 등록하려면 nrf_dfu_transport_t 등록 구조체를 매개변수로 사용하여 매크로 DFU_TRANSPORT_REGISTER를 호출한다. nrf_dfu_transports_init이 호출되면 등록된 모든 전송 계층이 각각의 초기화 함수로 초기화된다.(nrf_dfu_transport_t::init_func에 정의됨).

 

전송 계층 구현은 nrf_dfu_req_handler_on_req를 호출하여 애플리케이션에 DFU 요청을 전달하는 역할을 한다.

이 함수는 nrf_dfu_request_t유형의 요청을 받아 nrf_dfu_result_t유형의 응답 코드와 함께 nrf_dfu_response_t유형의

응답을 반환한다.

 

다음 표는 요청(nrf_dfu_request_t::request 참조) 및 응답(nrf_dfu_response_t 참조) 유형을 보여준다.

Request Opcode Type Parameters Response parameters
Protocol version 0x00 NRF_DFU_OP_PROTOCOL_VERSION None Version
Create 0x01 NRF_DFU_OP_OBJECT_CREATE Object type
Object size
None
Set receipt notification 0x02 NRF_DFU_OP_RECEIPT_NOTIF_SET Target value None
CRC 0x03 NRF_DFU_OP_CRC_GET None Offset
CRC
Execute 0x04 NRF_DFU_OP_OBJECT_EXECUTE None None
Select 0x06 NRF_DFU_OP_OBJECT_SELECT Object type Offset
CRC
Maximum object size
MTU Get 0x07 NRF_DFU_OP_MTU_GET None Size
Write 0x08 NRF_DFU_OP_OBJECT_WRITE Request payload
Request length
The length must be word-aligned.
None or CRC Response
Ping 0x09 NRF_DFU_OP_PING ID ID
HW Version Get 0x0A NRF_DFU_OP_HARDWARE_VERSION None Part
Variant 
nrf_dfu_response_hardware_t::memory "ROM size" 
nrf_dfu_response_hardware_t::memory "ROM page size" 
nrf_dfu_response_hardware_t::memory "RAM size"
FW Version Get 0x0B NRF_DFU_OP_FIRMWARE_VERSION Image number Type
Version Start address Size
Abort 0x0C NRF_DFU_OP_ABORT None None

1. Requests

nrf_dfu_req_handler_on_req를 호출하여 요청을 하면 nrf_dfu_result_t 유형의 결과 코드가 반환된다.

DFU 요청이 성공적으로 처리되면 결과 코드는 NRF_DFU_RES_CODE_SUCCESS이다.

가능한 오류 코드는 요청의 종류에 따라 다르다.

자세한 내용은 다음의 섹션을 참조한다. 여러 오류가 발생하면 하나의 오류 코드만 반환된다.

1.1 Protocol Version

이 명령의 Syntax와 ID는 영구적이다. 프로토콜 버전이 변경되면 다른 opcode가 더이상 유효하지 않을 수 있다.

이 명령은 선택사항이다.(NRF_DFU_PROTOCOL_VERSION_MSG)

1.2 Create request

Create 요청은 지정된 유형의 객체 생성을 트리거한다.

유효한 유형은 명령 개체(예:초기화 패킷) 또는 개체이다.

 

Create 요청에는 DFU 대상에서 다음 작업이 필요하다.

  • 개체를 위한 공간 예약
  • 마지막 실행 명령 이후의 진행률 재설정
  • 새 개체 선택

이러한 작업 중 하나라도 실패하면 다음 오류 코드 중 하나가 반환되어야 한다.

Error condition Response code
지정된 개체 유형이 지원되지 않음 NRF_DFU_RES_CODE_UNSUPPORTED_TYPE
지정된 크기가 0 NRF_DFU_RES_CODE_INVALID_PARAMETER
데이터 개체에 대해 지정된 크기가 페이지 정렬 되지 않았으며 마지막 개체도 아님  NRF_DFU_RES_CODE_INVALID_PARAMETER
DFU 대상은 지정된 크기의 개체를 허용할 수 없음 NRF_DFU_RES_CODE_INSUFFICIENT_RESOURCES
전송의 현재 상태는 주어진 크기와 유형의 개체를 만드는 것을 허용하지 않음 NRF_DFU_RES_CODE_OPERATION_NOT_PERMITTED
진행 상황을 Reset할 수 없음 NRF_DFU_RES_CODE_OPERATION_FAILED

1.3 Set receipt notification

이 요청은 Write request 명령 이후 CRC응답을 보내는 빈도를 구성한다.

0으로 설정하면 Write request 후에 CRC응답이 전송되지 않는다.

그렇지 않으면 n번째 Write request마다 전송된다.

여기서 n은 nrf_dfu_request_prn_t::target이다.

1.4 CRC request

CRC 요청은 현재 개체의 전송된 데이터의 오프셋 및 CRC보고를 해야한다.

DFU 컨트롤러는 데이터가 올바르게 전송되었는지 확인하기 위해 이러한 값을 정기적으로 확인해야 한다.

작업이 실패하면 다음 오류 코드가 반환되어야 한다.

Error condition Response code
현재 선택한 개체의 개체 유형이 잘못되었음. NRF_DFU_RES_CODE_INVALID_OBJECT

1.5 Execute request

개체가 완전히 작성된 후에 Execute 요청이 되어야 한다.

요청된 작업은 전송된 개체의 유형에 따라 다르다.

펌웨어 이미지의 모든 개체가 전송되면 사후 검증이 호출된다.

사후 검증이 성공하면 수신된 펌웨어 이미지의 활성화를 트리거한다.

작업 중 하나가 실패하면 다음 오류 코드 중 하나가 반환되어야 한다.

Error condition Response code
현재 선택한 개체의 개체 유형이 잘못됨. NRF_DFU_RES_CODE_INVALID_OBJECT
전송의 현재 상태는 현재 개체의 실행을 허용하지 않음. NRF_DFU_RES_CODE_OPERATION_NOT_PERMITTED

1.6 Select request

Select 요청은 지정된 개체 유형의 마지막으로 전송된 개체를 현재 활성 개체로 만든다.

또한 개체에 대한 정보(최대 크기, 현재 오프셋 및 현재 CRC)를 요청한다.

해당 유형의 유효한 개체가 없으면 개체 유형이 계속 선택된다.

이 경우 반환된 CRC와 오프셋은 0이다.

1.7 MTU Get request

전송은 이 요청에 대해 기본 MTU 크기를 반환한다.

1.8 Write request

Write 요청은 수신된 데이터를 장치에 저장하도록 한다. 데이터 작성 방법은 현재 선택한 개체의 유형에 따라 다르다.

수신된 데이터를 저장한 후 DFU 대상은 CRC응답으로 응답할 수 있는 새 CRC 및 오프셋을 계산해야 한다. 

(Set receipt notification 참조)

작업 중 하나가 실패하면 다음 오류 코드 중 하나가 반환되어야 한다.

Error condition Response code
현재 선택한 개체의 개체 유형이 잘못됨. NRF_DFU_RES_CODE_INVALID_OBJECT
전송의 현재 상태는 현재 개체에 대한 쓰기를 허용하지 않음. NRF_DFU_RES_CODE_OPERATION_NOT_PERMITTED
지정된 크기는 0. NRF_DFU_RES_CODE_INVALID_PARAMETER
지정된 크기가 너무 큼. NRF_DFU_RES_CODE_INVALID_PARAMETER

1.9 Ping

DFU 대상은 Ping 요청에서 수신한 것과 동일한 ID값으로 응답한다.

1.10 Hardware version

DFU 대상은 Hardware version 세부 정보가 포함된 메세지로 응답한다.

1.11 Firmware version

DFU 대상은 요청된 펌웨어의 유형 및 버전이 포함된 메세지로 응답한다. 펌웨어는 ID로 식별된다.

Firmware ID
Bootloader 0
SoftDevice 1
Application 2(SoftDevice가 없는 경우 1)

지정된 ID의 펌웨어가 없으면 응답에 NRF_DFU_FIRMWARE_TYPE_UNKNOWN 유형이 포함된다.

이 명령은 선택 사항이다.(NRF_DFU_PROTOCOL_FW_VERSION_MSG)

1.11 Abort

현재 DFU 프로세스를 중단한다. 부트로더는 해당 메세지에서 Reset된다.

2. Transport layers

다음 전송 계층을 사용할 수 있다.

 

 

반응형

+ Recent posts