이 장에서 다룰 내용
- Bootloader의 역할
- Firmware Image 구조
- CRC, Version, Rollback
- UART, USB, Ethernet 업데이트
- 현장 업데이트 실패 대응
10.1 Bootloader가 필요한 이유
Bootloader는 Main Firmware를 실행하기 전에 동작하는 작은 프로그램이다. 펌웨어 무결성을 확인하고, 업데이트 모드로 들어가고, 필요하면 복구 이미지를 실행한다. 개발 중에는 Debugger로 펌웨어를 넣을 수 있지만 제품이 장비 안에 들어가면 현장에서 Debugger를 연결하기 어렵다. 이때 Bootloader가 필요하다.
Loadport나 Pre-Aligner 보드는 고객 현장에서 기능 변경, 통신 프로토콜 수정, Error 처리 개선이 필요할 수 있다. 보드를 모두 회수하지 않고 펌웨어를 업데이트하려면 통신 기반 업데이트 구조가 있어야 한다. 단, 업데이트 중 실패해 보드가 부팅되지 않으면 장비가 멈추므로 복구 구조가 중요하다.
Bootloader는 기능을 많이 넣기보다 안정적이어야 한다. 통신, Flash 쓰기, CRC 확인, 버전 확인, 안전 출력 Off, 복구 진입 조건 정도로 역할을 제한하는 것이 좋다.
10.2 Flash Memory Map
Firmware Update를 설계하려면 Flash Memory Map부터 정해야 한다. 일반적인 구조는 Bootloader 영역, Application 영역, 설정 영역, 로그 영역, 업데이트 임시 영역으로 나뉜다.
이중 이미지 구조에서는 App A와 App B를 두고 새 이미지를 사용하지 않는 영역에 먼저 기록한다. CRC 확인이 끝난 뒤 Boot Flag를 바꾸고 새 이미지를 실행한다. 새 이미지가 정상 부팅을 확인하지 못하면 이전 이미지로 돌아갈 수 있다.
Flash Map에는 각 영역의 시작 주소, 크기, 보호 여부, 지우기 단위, 쓰기 단위를 명확히 적는다. 설정값이나 Calibration Data가 펌웨어 업데이트 중 지워지지 않도록 영역을 분리해야 한다.
10.3 Image Header와 CRC
Firmware Image에는 Header가 필요하다. Header에는 Magic Number, Image Size, Version, Board Revision, Build Date, CRC, Entry Address 같은 정보가 들어간다. Bootloader는 Header를 읽고 이 이미지가 실행 가능한지 판단한다.
CRC는 이미지가 전송 중 깨졌는지 확인하는 데 사용한다. CRC가 맞지 않으면 절대 실행하지 않는다. Version과 Board Revision도 중요하다. Loadport용 펌웨어가 Pre-Aligner 보드에 들어가거나, Rev가 다른 보드에 잘못 들어가면 출력 Pin이 달라 위험할 수 있다.
Image Header는 상위 업데이트 Tool과 Bootloader가 같은 규칙으로 해석해야 한다. 문서화되지 않은 Header는 시간이 지나면 유지보수하기 어렵다.
10.4 업데이트 프로토콜
업데이트는 UART, RS-485, USB, Ethernet 등으로 할 수 있다. 어떤 방식을 쓰든 기본 흐름은 비슷하다. 업데이트 시작, 보드 정보 확인, 이미지 전송, Chunk별 응답, CRC 확인, 적용 요청, 재부팅, 정상 실행 확인 순서다.
RS-485처럼 Half-duplex 통신을 사용할 경우 Chunk 크기, Timeout, Retry를 보수적으로 잡는다. Ethernet은 빠르지만 네트워크 설정과 연결 끊김 처리가 필요하다. USB는 현장 작업자가 직접 연결하기 쉬우나 커넥터 접근성과 드라이버 문제가 있을 수 있다.
업데이트 중에는 구동 출력이 Off여야 한다. 펌웨어 업데이트 모드에서 Solenoid나 Motor Driver가 제어되는 일은 없어야 한다. 상위 Controller에도 업데이트 중임을 알려 장비 동작 명령이 들어오지 않도록 해야 한다.
10.5 Rollback과 Recovery
Rollback은 새 펌웨어가 실패했을 때 이전 펌웨어로 돌아가는 기능이다. 제품 신뢰성 측면에서 매우 중요하다. 새 이미지가 CRC는 맞지만 실행 중 문제가 생길 수 있으므로, 첫 부팅 후 Application이 "정상 실행 확인" Flag를 Bootloader에 남기는 구조가 좋다.
Recovery는 더 낮은 수준의 복구다. 두 이미지가 모두 실패하거나 설정이 손상된 경우에도 Bootloader 모드로 들어가 새 펌웨어를 받을 수 있어야 한다. 특정 버튼, Jumper, Jig Pin, 상위 명령을 통해 복구 모드에 진입할 수 있다.
복구 모드에서는 안전 출력 Off, 통신 대기, 최소 로그 출력만 수행한다. 복구 모드가 복잡하면 오히려 실패 가능성이 커진다.
10.6 생산과 서비스에서의 버전 관리
제품에는 펌웨어 버전, Bootloader 버전, 보드 Rev, 설정 버전, Calibration 버전이 함께 관리되어야 한다. 생산 검사에서 이 정보를 읽어 기록하면 나중에 고장 분석과 고객 대응이 쉬워진다.
버전은 사람이 읽을 수 있는 문자열과 프로그램이 비교할 수 있는 숫자를 함께 두는 것이 좋다. 예를 들어 FW 1.2.3, Boot 0.4.1, Board Rev B, Config Schema 2처럼 관리한다. 업데이트 Tool은 호환되지 않는 조합을 막아야 한다.
서비스 현장에서는 "최신 펌웨어"보다 "해당 장비와 호환되는 펌웨어"가 중요하다. Board Rev, 고객 옵션, 장비 모델에 따라 기능이 다를 수 있으므로 업데이트 패키지와 적용 조건을 명확히 관리해야 한다.
체크리스트
- 업데이트 중 전원이 꺼져도 복구 가능한가?
- Flash Map이 Bootloader, Application, 설정, 로그 영역으로 분리되어 있는가?
- Image Header에 Version, Board Rev, CRC가 포함되어 있는가?
- Firmware Update 중 모든 구동 출력이 Off 상태인가?
- Rollback 또는 Recovery 모드가 정의되어 있는가?
- 생산 검사에서 펌웨어 버전과 보드 Rev를 기록하는가?