https://www.youtube.com/watch?v=P3Judr4i7QI&list=PLCGpd0Do5-I3b5TtyqeF1UdyD4C-S-dMa&index=5
유튜브 강의를 수강하면서 device driver을 구현하고 있었다. 나는 14번 핀에 버튼을, 21번 핀에 LED를 연결한 상태였다. 그런데, 라즈베리파이 5 기준으로 두 핀이 인식되지 않는 문제가 있었다.
#define BTN_NO 14 // 14
#define LED_NO 21 // 21
if(gpio_request(LED_NO, "rpi-gpio-21")) {
printk("cannot allocate gpio 21\n");
goto AddError;
}
/* set gpio 21 as output direction */
if(gpio_direction_output(LED_NO, 0)) {
printk("cannot set gpio 21 to output\n");
goto GPIO21Error;
}
/* gpio init 15 (button) */
if(gpio_request(BTN_NO, "rpi-gpio-14")) {
printk("cannot allocate gpio 15\n");
goto AddError;
}
/* set gpio 15 as input direction */
if(gpio_direction_input(BTN_NO)) {
printk("cannot set gpio 15 to output\n");
goto GPIO15Error;
}
위 코드를 실행하면 핀 번호를 할당하지 못했다는 예외 메시지가 발생했다.
https://stackoverflow.com/a/78888765
정보를 찾아보니, 라즈베리파이 커널 버전이 6.6 이상인 경우 외부에 공개되는 GPIO 핀 번호와 내부적으로 사용하는 핀 번호가 달라 커널 모듈에서 14, 21이라는 핀 번호로 접근할 수 없다고 한다. 대신 /sys/kernel/debug/gpio을 통해 실제 핀 번호를 알아낼 수 있다.
출력 기준 좌측의 5xx에 해당하는 정보가 라즈베리파이 내부적으로 사용하는 실제 핀 번호로, GPIOxx에 매핑되어 있다. 따라서, 커널 내부에서 GPIO에 접근할 때는 GPIOxx에 대한 실제 핀 번호를 찾아 사용하면 된다.
예를 들어 14번, 21번 핀을 사용하는 경우 14 => 585, 21 => 592라는 실제 핀 번호를 찾아 사용한다.
#define BTN_NO 585 // 14
#define LED_NO 592 // 21
실제 핀 번호를 매칭하고 나니, 커널 모듈이 문제없이 동작했다.
'IoT' 카테고리의 다른 글
[wsl] 그래픽 깨짐 현상 (0) | 2024.11.06 |
---|---|
[라즈베리파이] vscode로 커널 개발 시 intellisence 에러 없애기 (1) | 2024.10.15 |
[라즈베리파이] PC에서 SSH로 접근 (0) | 2024.09.19 |
MQTT - mosquitto & 통신 실습 (3) | 2024.07.25 |
MQTT(Message Queueing Telemetry Transport) (0) | 2024.07.24 |