사용자 공간 I/O: 앱에서 하드웨어 다루기
드라이버를 직접 만들지 않고 /dev, sysfs, ioctl, libgpiod로 GPIO, I2C, SPI, UART를 다루는 방법.
장치별 방법
| 장치 | 인터페이스 | 도구 / 라이브러리 |
|---|---|---|
| GPIO | /dev/gpiochipN (문자 장치) | libgpiod, gpioset, gpioget |
| I2C | /dev/i2c-N | i2cdetect, i2cget, ioctl(I2C_RDWR) |
| SPI | /dev/spidevX.Y | spidev ioctl |
| UART | /dev/ttyS, /dev/ttyUSB | termios |
| PWM | /sys/class/pwm/ | sysfs |
| ADC | /sys/bus/iio/devices/ | IIO |
예전 /sys/class/gpio 인터페이스는 폐기되는 중이라 새 코드는 libgpiod를 씁니다.
I2C 읽기 예 (Python)
from smbus2 import SMBus
with SMBus(1) as bus:
raw = bus.read_i2c_block_data(0x68, 0x3B, 6) # MPU6050 가속도
언제 사용자 공간, 언제 드라이버
| 사용자 공간이 좋을 때 | 드라이버가 필요할 때 |
|---|---|
| 프로토타입, 느린 센서 | µs 단위 응답, 높은 인터럽트 빈도 |
| 개발 속도가 중요 | 여러 프로그램이 공유 |
| 커널 서브시스템(네트워크, 입력 장치)에 통합 |
실시간성 주의
리눅스 사용자 프로그램은 스케줄러가 언제든 멈출 수 있어 수 ms 지터가 생깁니다. 정밀한 PWM이나 모터 제어는 MCU에 맡기고 리눅스는 상위 판단과 통신을 맡기는 구성이 흔합니다.