방탄 펌웨어 업그레이드


16

사용자가 판매 후 장치 펌웨어 를 안전하게 업그레이드 하기 위해 어떤 종류의 기술이 사용 됩니까? Cortex M3 / 4 마이크로 컨트롤러 로이 작업을 수행하고 싶지만 모든 마이크로 기술이해야한다고 생각합니다.

바람직하게는 물론 최소량의 추가 성분이 포함된다.

답변:


16

코드에 필요한 플래시 메모리 양이 2 배 이상인 칩을 사용하십시오. 이렇게하면 문제가 발생할 경우를 대비하여 이전 펌웨어를 그대로두고 새 펌웨어를이 메모리에 가져올 수 있습니다.

새 펌웨어의 체크섬을 해독하고 확인한 후 부트 로더는이를 이전 위치를 대체하여 최종 위치로 복사 할 수 있습니다. 이 부분에서 문제가 발생하면 하드 리셋 후 부트 로더는 새 펌웨어가 유효하지 않은 것을 확인하고 (체크섬을 다시 한 번 실행하여) 복사를 다시 시도해야합니다.

이것이 내가 아는 가장 간단하고 가장 멍청한 방법입니다. 또한 부트 로더에는 코드가 거의 필요하지 않으며 메인 프로그램과 부트 로더 사이에 기능을 복제 할 필요가 없습니다 (부트 로더에 통신 로직이 필요하지 않음).


10
전자 제품의 사용자로서, 새로운 펌웨어가 올바른 체크섬을 가지고 있지만 소프트웨어 자체에 버그가있는 경우 부팅하는 동안 구 펌웨어를 부팅 할 수있는 버튼이 있으면 좋을 것입니다.
Zan Lynx

4
이 솔루션에서 볼 수있는 "문제"는 일종의 재배치 테이블 또는 완전한 위치 독립적 코드가 필요하다는 것입니다. 그렇지 않으면 코드가 실행되지 않습니다.
니코 에르푸르트

2
@Masta-펌웨어가 최종 (일반) 위치로 복사되는 부분을 이해하지 못합니다.
케빈 베르메르

3
@jpc-직장 내 일부 툴에서 외부 직렬 플래시 칩과 함께이 기술을 사용합니다. 8 핀 SOIC 또는 QFN 부품을위한 공간이있는 경우 플래시가 두 배 이상인 마이크로 컨트롤러가 필요하지 않습니다. 1MB 미만의 직렬 플래시 메모리를 1 달러 미만으로 사용할 수 있으므로 경우에 따라 마이크로 컨트롤러를 업그레이드하는 것보다이 경로를 이용하는 것이 더 저렴할 수 있습니다!
Kevin Vermeer

@zan-응, 우리도 이것을 사용한다. 한 가지 우려 또는 이점은 이전 펌웨어를 다시 복사 할 때 장치가 기본값으로 재설정된다는 것입니다 (마이크로에는 EEPROM이 없으며 MAC 주소 및 IP 주소와 같은 구성 데이터는 자체 작성 플래시에 저장 됨). 우리에게는 IP 주소를 잊었을 때 보드를 쉽게 찾을 수 있습니다.
Kevin Vermeer

12

부트 로더와 몇 KB의 추가 플래시를 사용하십시오.

UART, USB, I2C 또는 다른 프로토콜을 통해 특정 명령을 보내 부트 로더가 업그레이드를 수행합니다. 메인 코드 만 업데이트됩니다. 부트 로더 코드는 외부 프로그래머 (예 : PIC 용 JTAG / PICkit 등)를 제외하고는 절대로 건드리지 않습니다.

업데이트가 실패하면 (정전, 누군가가 전선을 넘어서 넘어 지거나 다른 이유로) 위젯이 작동하지 않지만 부트 로더는 여전히 존재하므로 업그레이드를 다시 시도 할 수 있습니다.

메인 코드가 완전히 업데이트되지 않았기 때문에 메인 코드가 잘못 실행되는 것을 방지하는 플래그를 어딘가에 바이트로 설정할 수 있습니다.


부팅시 전원이 켜진 경우 부트 로더를 강제로 실행할 수도 있습니다. 이는 즉시 충돌하는 불량 펌웨어를로드하는 경우 도움이됩니다. X 초 후에 응용 프로그램을 실행하려면 부트 로더에 시간 초과가 필요합니다.
Robert

비동기 프로토콜, TTL 또는 485와 같은 간단한 프로토콜을 사용할 수 있다면 좋은 생각입니다. 더 많은 관련 사례 (SD 카드, GPRS, USB)의 경우 (업그레이드 불가) 부트 로더에 복잡한 지원 코드를 포함시키지 않습니다. 이더넷 OTOH (원시 UDP 또는 TFTP)는이를 위해 충분히 간단합니다.
jpc

3

장치가 비교적 비싸고 비용을 감당할 수 있고 (고객이 업그레이드에 관심을 기울이면)이 작업을 수행 할 수 있습니다 ...

(일반적으로이 기술은 외부 저장소 또는 jtag의 악의적 인 사용이 필요합니다.)

시스템을 정지시키고 다시 프로그래밍 할 수있는 고정 된 프로그램 마이크로 (예 : 작은 PIC)가 있어야합니다.

"업그레이드 프로세서"펌웨어를 변경할 수 없으므로 잘못 될 수 없습니다.

1) 사용자가 장치를 업그레이드 할 수 있습니다

2) 업그레이드가 실패하면 항상 다시 시도 할 수 있습니다. 벽돌로 만들 수 없습니다

3) 대상 장치가 부트 로더를 지원하지 않는 경우에도 (부팅하고 실행하고 싶어 함) 여전히 원하는 작업을 수행 할 수 있습니다.

FPGA, DSP 및 기타 홀수 대상에 사용됩니다.

정말 깔끔한 사용자 인터페이스를 가질 수 있습니다 (PIC도 웹 서버를 실행할 수 있습니다 ....)


2

제품에 간단한 직렬 인터페이스 (예 : EIA232) 가 있는지 확인하십시오 . DB-9를위한 공간이 없으면 비표준 커넥터는 정상입니다. 예를 들어 TxD, RxD 및 접지에 TRS 커넥터 만 있으면됩니다.

장치를 처음 프로그래밍 할 때는 부트 로더를 포함하십시오 . 이것은해야 가능한 한 간단하게 조만간 당신이 새로운 기능을 필요로한다면 부트 로더 자체를 업그레이드 할 것이기 때문. (아마도 업그레이드 할 수 없습니다 )

그런 다음 TRS 커넥터입니다. 커넥터가있는 경우 감지 할 수 있도록 스위치가있는 잭을 사용하십시오. 리셋을 바로 확인하고 플러그가 있으면 부트 로더를 시작하고 그렇지 않으면 응용 프로그램을 시작하십시오. 그렇게하면 부트 로더와 사용자 응용 프로그램이 잘 분리되어 있습니다. (수표는 실제로 부트 로더의 일부입니다. 응용 프로그램의 버전에 관계없이 필요합니다. 그렇지 않으면 부트 로더에 들어갈 수 없습니다!)


왜 부트 로더를 업그레이드하고 싶습니까? 업그레이드 프로세스로 인해 장치가 손상되지 않도록하려면 어떻게해야합니까? 가능하다면 어떤 새로운 기능이 강력 해져 업그레이드에 벽돌을 놓을 위험이 있습니까?
Kevin Vermeer

5
@Kevin-부트 로더가 너무 단순해서 "업그레이드"에 대해 생각조차하지 않을 것이라고 생각했습니다.
jpc

@jpc-아, 맞습니다, 잘못 해석했습니다. 우리는 동의합니다!
Kevin Vermeer

1

'업그레이드'는 어떤 장비를 사용할 수 있습니까? PC, USB 스틱, 마이크로 SD 카드?

한 가지 방법은 응용 프로그램을 이동식 항목 (USB 스틱, SD 카드 등)에 두는 것입니다. 칩은 해당 응용 프로그램을 항목에서로드합니다. 업그레이드 프로그램은 단순히 항목을 교체하고 재부팅합니다.

내가 아는 ARM 및 Cortex 마이크로 컨트롤러 칩 (NXP, Atmel)에는 모두 내장형 직렬 부트 로더가 있으므로 업데이트 프로그램이 PC 및 직렬 케이블과 함께 제공되는 경우 (COM 포트 인터페이스를 준비한 경우) 간단하게 다운로드 할 수 있습니다. 최신 정보.


COM 포트와 PC에 연결되어있는 동안 UART 핀을 포트에 연결하는 것만으로도 MCU의 코드없이 펌웨어를 플래시 할 수 있습니까? 좋은 팁.
Imbrondir

데이터 시트, 'bootloader'섹션을 확인하십시오. 이렇게하려면 실제로 '손을 떼십시오'1. 칩을 리셋하는 방법이 필요합니다. 2. 부트 로더를 활성화하십시오 (칩은 세 라틴 핀을 점검합니다). 점퍼와 (재설정) 스위치로이 작업을 수행 할 수 있지만보다 편리한 방법 (특히 책상에서)은 두 핸드 셰이크 라인을 사용하여 '핸드 오프'를 수행하는 것입니다. 대부분의 PC 다운로드 프로그램 (예 : flashmagic, lpc21isp)은 핸드 셰이 킹 매직을 수행 할 수 있습니다 (핸드 셰이크 라인을 올바르게 연결 한 경우).
Wouter van Ooijen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.