# 1. 하드웨어 펌웨어 플래싱(Flashing) 및 Bootloader 아키텍처
로컬 PC에서 툴체인의 피를 말리는 컴파일 연산이 끝나고 생성된 바이너리(.px4)를 드론의 두뇌인 Pixhawk 보드의 비휘발성 플래시(Flash) 메모리에 이식하는 이 ‘플래싱(Flashing)’ 트랜잭션은 어떠한 원리로 일어나는가?
우리가 USB 레벨에서 make px4_fmu-v6c_default upload 명령의 트리거를 당겼을 때, 호스트와 마이크로컨트롤러 사이에서 벌어지는 은밀한 핸드셰이크(Handshake)와 부트로더(Bootloader) 아키텍처의 개입을 파헤친다.
부트로더의 심연: 5초의 황금 골든타임
드론에 전원이 인가되었을 때 가장 먼저 눈을 뜨는 코드는 당신이 짠 C++ 펌웨어가 아니다. 메모리의 영번지(0x08000000) 가장 밑바닥에 불변의 영역으로 박혀있는 16KB 수준의 극소형 보호 프로그램, 바로 PX4 Bootloader다.
부트로더가 부팅 직후 가장 먼저 하는 행동은 칩셋 초기화가 끝난 직후 정확히 3 초에서 5 초 동안 USB 포트를 향해 귀를 열고 침묵하는 것이다.
“혹시 호스트 PC 님이 나에게 바이트 스트림(새 펌웨어)을 꽂아 넣으려고 하십니까?” 기다리는 이 대기 상태(Waiting state)가 바로 플래싱의 골든타임이다. 이 5초 안에 아무런 신호(Magic bytes)가 들어오지 않으면 부트로더는 체념하고 제어권을 메인 메모리 번지로 점프(Jump)시켜 버려 기존에 들어있던 펌웨어(비행 로직)를 깨워버린다.
호스트 Flasher 스크립트와의 싱크(Synchronization)
호스트 터미널에서 upload 명령을 발포하면, PX4 소스 디렉토리 내에 은닉된 px_uploader.py 라는 파이썬 자객 엔진이 깨어난다.
이 스크립트는 로컬 머신의 모든 시리얼 포트들(/dev/ttyACM0 등)을 미친 듯이 스캔하면서, 부트로더가 기다리는 특수한 프로토콜(예: GET_SYNC 시그널 방출)을 난사한다.
- Sync 바인딩: 만약 드론에 방금 전원이 켜져 부트로더가 이 신호를 잡게 되면 즉각 응답(ACK)을 보내며 싱크가 통일된다. (이 때문에 QGroundControl이나 쉘에서 ‘보드의 USB 선을 뽑았다가 다시 꽂으세요’ 라는 문구가 나오는 것이다. 전원을 강제로 리셋시켜 강제 부트로더 모드로 넣기 위함이다.)
- 보드 ID 핑거프린트 확인: 우겨넣으려는
.px4펌웨어 헤더에 박힌 매직 넘버(예: FMUv6C 고유 번호)와 타겟 하드웨어 보드의 주민번호(HW Info) 가 일치하는지 서로 교차 검증을 때린다. 버전이 맞지 않으면 부트로더는 하드웨어 칩이 타버리는 물리적 파우너(Burnout)를 막고자 과감하게 패킷을 뱉어내고 연결을 폭파해 버린다. - 플래시 소거 및 주입: 인증이 승인되면 부트로더는 칩셋의 메인 플래시 섹터 영역 공간을 깨끗하게 갈아엎고 지워버린다(Erase). 그 뒤 Python 스크립트가 쏴주는 거대한 헥스 스트림(Hex stream)을 100% 무결성으로 버퍼에 담아 플래시에 순차 타각(Write)한 뒤, CRC 무결성 체크업을 하고 기체를 스스로 소프트 리부트(Soft Reboot) 시킨다.
이것이 QGroundControl UI 바가 0%에서 100%로 스무스하게 올라가는 아름다운 플래싱 이면의 통신 프로토콜 전장이다.