라즈베리파이 5 GPIO LED 제어를 위한 리눅스 디바이스 드라이버 만들어보기

클로드를 사용하여 라즈베리파이 5에서 LED 켜고 끄는 디바이스 드라이버 만드는 방법을 조사후 진행해봤습니다.
2025. 1. 16 최초작성
원래는 다음처럼 연결해야 하지만, 편의상 저항은 빼고 연결했습니다.
GPIO 18 (PIN 12) → 220Ω 저항 → LED 긴 다리 → LED 짧은 다리 → GND
이미지 출처 - https://www.reddit.com/r/raspberry_pi/comments/18y24yr/powering_raspberry_pi_5_with_gpio/
필요한 패키지를 설치합니다.
$ sudo apt update
$ sudo apt install raspberrypi-kernel-headers build-essential
코드를 저장할 디렉토리를 만들고 그 안에 소스 코드를 저장합니다.
pi@raspberrypi:~ $ mkdir led_driver
pi@raspberrypi:~ $ cd led_driver/
pi@raspberrypi:~/led_driver $ nano led_driver.c
다음 코드를 led_driver.c에 붙여넣고 Ctrl + O눌러 저장하고 Ctrl + X를 눌러 nano에서 빠져나옵니다.
GPIO 18번 핀을 사용하도록 코드가 작성되어 있습니다. 주의할점은 GPIO 18번에 대해 내부 핀 번호 589를 사용해야 합니다.
참고 https://blaxsior-repository.tistory.com/294
다음 명령으로 내부 핀번호 확인이 가능합니다.
$ cat /sys/kernel/debug/gpio
Makefile을 생성하여 다음 코드를 붙여넣고 Ctrl + O눌러 저장하고 Ctrl + X를 눌러 nano에서 빠져나옵니다.
pi@raspberrypi:~/led_driver $ nano Makefile
이제 모듈을 빌드합니다. 코드 수정해도 절대 make clean을 하지 마세요. 커널 헤더를 지워버려서 문제가 생깁니다.
pi@raspberrypi:~/led_driver $ make
make -C /lib/modules/6.6.62+rpt-rpi-2712/build M=/home/pi/led_driver modules
make[1]: Entering directory '/usr/src/linux-headers-6.6.62+rpt-rpi-2712'
CC [M] /home/pi/led_driver/led_driver.o
MODPOST /home/pi/led_driver/Module.symvers
CC [M] /home/pi/led_driver/led_driver.mod.o
LD [M] /home/pi/led_driver/led_driver.ko
make[1]: Leaving directory '/usr/src/linux-headers-6.6.62+rpt-rpi-2712'
모듈을 로드합니다.
pi@raspberrypi:~/led_driver $ sudo insmod led_driver.ko
커널 로그를 확인할 수 있습니다.
pi@raspberrypi:~/led_driver $ dmesg | tail
[ 4.208238] macb 1f00100000.ethernet: gem-ptp-timer ptp clock registered.
[ 4.216415] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[ 8.217902] Bluetooth: RFCOMM TTY layer initialized
[ 8.217912] Bluetooth: RFCOMM socket layer initialized
[ 8.217922] Bluetooth: RFCOMM ver 1.11
[ 332.746253] led_driver: loading out-of-tree module taints kernel.
[ 391.111387] LED Driver: 초기화 시작
[ 391.111416] LED Driver: 초기화 완료
권한을 설정합니다.
pi@raspberrypi:~/led_driver $ sudo chmod 666 /sys/kernel/led_driver/value
LED가 켜집니다. 상태확인도 가능합니다.
pi@raspberrypi:~/led_driver $ echo 1 > /sys/kernel/led_driver/value
pi@raspberrypi:~/led_driver $ cat /sys/kernel/led_driver/value
1
LED가 꺼집니다. 상태확인도 가능합니다.
pi@raspberrypi:~/led_driver $ echo 0 > /sys/kernel/led_driver/value
pi@raspberrypi:~/led_driver $ cat /sys/kernel/led_driver/value
0
pi@raspberrypi:~/led_driver $
커널 로그를 확인합니다.
pi@raspberrypi:~/led_driver $ dmesg | tail
[ 391.111387] LED Driver: 초기화 시작
[ 391.111416] LED Driver: 초기화 완료
[ 553.606858] LED Driver: LED set to 1
[ 606.958806] LED Driver: LED set to 0
드라이버를 제거합니다.
pi@raspberrypi:~/led_driver $ sudo rmmod led_driver.ko
커널 로그를 확인합니다.
pi@raspberrypi:~/led_driver $ dmesg | tail
[ 391.111387] LED Driver: 초기화 시작
[ 391.111416] LED Driver: 초기화 완료
[ 553.606858] LED Driver: LED set to 1
[ 606.958806] LED Driver: LED set to 0
[ 635.966072] LED Driver: 제거 시작
[ 635.966092] LED Driver: 제거 완료
Comments ()