### 0.0.1 I2C 기반 드라이버 구조 분석: ST VL53L1X/L0X 레지스터 맵핑 및 인터럽트 처리 로직
소형 멀티로터나 실내 군집 드론(Swarm Drone)에서 전방위 회피용으로 도배하듯 달아놓는 초소형 센서가 STMicroelectronics 사의 VL53L1X 또는 VL53L0X 다. 이들은 UART가 아닌 I2C 버스를 통해 메인 프로세서와 통신하며, 레지스터(Register) 단위의 정밀한 메모리 맵핑(Memory Mapping) 쓰기/읽기 제어가 필수적이다. PX4 src/drivers/distance_sensor/vl53l1x/vl53l1x.cpp 모듈은 이 과정을 어떻게 최적화하고 있을까?
복잡한 I2C 레지스터 스퀀스 초기화 (Initialization)
VL53 계열 센서는 전원이 켜지면 멍텅구리에 불과하다. 제조사(ST)가 제공하는 방대한 양의 ‘매직 스위치’ 레지스터 어레이들을 I2C 버스를 통해 센서 내부 SRAM에 주입(Booting)해 주어야만 비로소 광학 렌즈가 깨어난다. PX4 소스 코드는 이 긴 초기화 바이트 배열들을 프로그멤(ROM/Flash) 영역 상수에 하드 코딩해두고, 부팅 시 I2C::transfer() 함수를 한 줄씩 블록킹(Blocking) 방식으로 호출하여 센서의 Timing Budget(초당 몇 번 빛을 회수할지)과 측정 모드(Short/Long Range)를 강제 설정한다.
데이터 수집: 폴링(Polling) 대 인터럽트(Interrupt/Data Ready)
데이터를 읽어내는 시퀀스는 Run()이라는 스케줄러 큐 등록 타이머 함수가 관장한다.
비효율적인 펌웨어는 루프를 돌며 계속 “데이터 다 준비됐어?” 하고 레지스터를 쪼아대는 막지식(Busy-wait Polling) 방식을 쓰지만, PX4의 VL53L1X I2C 드라이버는 고성능 RTOS(NuttX) 환경의 타이머를 영리하게 사용한다.
- 측정 트리거(Trigger): I2C로 ‘측정 시작’ 레지스터 명령을 날린 뒤, 즉시 해당 드라이버 Task를 슬립(Sleep) 모드로 재워버린다.
- 타이머 스케줄링: 설정해 둔 Timing Budget(예: 33ms) 시간 뒤에 다시 RTOS가 이 Task를 깨우도록
ScheduleDelayed()워크 큐(Work Queue)를 건다. CPU는 이 33ms 동안 놀지 않고 다른 비행 제어 알고리즘을 계산한다. - 데이터 리딩(Reading): 깨어난 드라이버가 I2C를 열고 Result 레지스터 뱅크(
0x0089등)에서 거리 바이트를 일괄(Sequential Burst Read)로 긁어온다.
최신 레이아웃의 비행 제어 보드에서는 타이머마저 아끼기 위해 VL53L1X의 하드웨어 핀 GPIO1 (Data Ready Interrupt)과 Pixhawk의 외부 인터럽트 EXTI 핀을 점퍼(Jumper)로 연결하여, I2C 데이터가 준비되는 즉시 하드웨어 펄스로 드라이버를 깨우는 인터럽트 구동형(Interrupt-Driven) 마이크로 아키텍처도 지원하고 있다. 이것이 하이엔드 드론 플랫폼에서 I2C 센서를 융합하는 실무적 교과서이다.