본문 바로가기

IoT

[라즈베리파이] 라즈베리파이 5 device driver에서 gpio에 접근

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

 

Not able to access GPIO pins on my Raspberry Pi 5

I recently got started with device drivers programming on my Raspberry Pi. I was writting a program to access GPIO pins. I'm facing an error during gpio_request(). Cant seem to figure out what the

stackoverflow.com

정보를 찾아보니, 라즈베리파이 커널 버전이 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

실제 핀 번호를 매칭하고 나니, 커널 모듈이 문제없이 동작했다.