⚙️

08. 공개 IIO 드라이버를 끝까지 추적했지만 실제 경로가 아니었다

단계
Kernel
상태
완료
순서
8
시기
2024.08–09
요약
lsm6dsx의 struct·probe·ODR callback을 따라간 뒤 실제 Galaxy Watch5 경로가 Sensor Hub임을 확인했다.
🔍
질문 — 커널에 공개된 LSM6DSX IIO 드라이버가 Galaxy Watch5 가속도계의 실제 제어 경로인가?

왜 이 경로를 먼저 봤는가

Galaxy Watch5가 사용하는 IMU와 같은 계열의 드라이버가 커널 소스에 있었고, 그 안에는 ODR(Output Data Rate)을 설정하는 코드가 분명히 보였다. 처음에는 이 부분을 수정하면 센서 샘플링 레이트를 바꿀 수 있을 것이라고 생각했다.
내가 먼저 정리한 것은 함수 하나가 아니라, 드라이버가 장치를 등록하고 IIO 인터페이스에 연결되는 전체 흐름이었다.

구조체부터 연결했다

구조체
당시 분석한 역할
struct device
커널의 일반 장치 객체
struct st_lsm6dsx_hw
LSM6DSX 하드웨어 전체 상태
struct iio_dev
IIO 장치
struct st_lsm6dsx_sensor
가속도계·자이로 등 개별 센서 상태
st_lsm6dsx_probe()에서 하드웨어를 초기화하고, 각 센서를 IIO 장치로 등록하는 흐름을 따라갔다. 이후 사용자의 요청이 어떤 callback을 거쳐 실제 register write로 이어지는지도 추적했다.

ODR table

원문에서 정리한 ODR 후보는 다음과 같았다.
13 Hz 26 Hz 52 Hz 104 Hz 208 Hz 416 Hz
중심 함수는 st_lsm6dsx_set_odr()였다. 이 함수가 요청한 주파수에 맞는 값을 찾고, 마지막에는 regmap_update_bits()로 register를 갱신한다.

원문에서 그린 함수 호출 trace

LSM6DSX probe와 IIO callback을 따라가며 정리한 원본 분석 화면
LSM6DSX probe와 IIO callback을 따라가며 정리한 원본 분석 화면

callback까지 추적했다

iio_info와 buffer operation을 따라가면서 사용자가 sysfs 또는 IIO buffer를 통해 값을 바꿀 때 어떤 함수가 호출되는지 정리했다. 이때까지는 공개된 IIO 드라이버가 실제 제어 경로라는 가정 아래 분석했다.

그런데 커널을 바꿔도 예상한 위치가 변하지 않았다

드라이버를 수정하고 커널을 빌드했지만, firmware의 kernel 영역에서 예상한 변화가 보이지 않았다. 여기서 여러 가능성을 세웠다.
  • 이 드라이버가 built-in이 아니라 .ko로 들어갔을 가능성
  • ramdisk나 별도 module 영역에 있을 가능성
  • Device Tree 설정이 다른 드라이버를 선택할 가능성
  • Galaxy Watch5의 실제 센서 경로가 이 공개 IIO 드라이버가 아닐 가능성
마지막 가능성이 이후 분석의 방향을 바꿨다. 실제 Watch5의 센서 명령은 일반 IIO 경로에서 끝나는 것이 아니라 Samsung Sensor Hub(SSP)를 통과하고 있었다.
이 분석은 틀린 경로를 오래 본 기록이기도 하다. 하지만 이 경로를 끝까지 확인했기 때문에, 커널의 공개 드라이버를 조금 고치는 것으로 끝나는 문제가 아니라는 것을 알 수 있었다. 지운 실패가 아니라 다음 대상을 좁힌 실패였다.