디바이스 드라이버: 커널 모듈 만들기
커널 안에서 하드웨어를 다루는 코드. 가장 단순한 모듈부터 플랫폼 드라이버, I2C 드라이버의 구조까지.
가장 단순한 커널 모듈
#include <linux/module.h>
static int __init hello_init(void) { pr_info("hello\n"); return 0; }
static void __exit hello_exit(void) { pr_info("bye\n"); }
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
insmod hello.ko로 올리고 dmesg로 확인, rmmod hello로 내립니다.
드라이버 모델
| 개념 | 의미 |
|---|---|
| 버스 | platform, i2c, spi, usb |
| 디바이스 | 디바이스 트리에 적힌 장치 |
| 드라이버 | compatible이 맞으면 probe()가 호출됨 |
I2C 센서 드라이버라면 probe()에서 레지스터를 초기화하고, 사용자 공간에 값을 보여 줄 인터페이스(sysfs 속성, IIO, hwmon, 문자 장치)를 만듭니다.
MCU 코드와의 차이
- 커널에서 크래시는 보드 전체가 죽습니다(커널 패닉).
- 부동소수점 사용 제한, 스택이 작음(수 KB)
- 레지스터 접근은
ioremap과readl/writel, I2C는i2c_smbus_read_byte_data같은 서브시스템 API - 인터럽트 처리는 위(빠른 처리)와 아래(스레드, 작업 큐)로 나눔
먼저 찾아보기
대부분의 흔한 칩은 이미 메인라인 커널에 드라이버가 있습니다. 디바이스 트리만 맞게 쓰면 되는 경우가 많습니다.