by Taehee Jeong

GPIO API Based on memory-mapped GPIO registers

GPIO API 구현을 위해, 다음의 네 가지 함수를 구현하였다.

  • int set_pin_mode (gpio_pin_e pin, gpio_direction_e mode)
  • int get_pin_mode (gpio_pin_e pin)
  • set_pin_value (gpio_pin_e pin, gpio_value_e value)
  • get_pin_value (gpio_pin_e pin)

set/get_pin_mode 함수는 각 GPIO 핀의 모드(IN/OUT)을 변경하고 읽어오며, set/get_pin_value 함수는 GPIO 핀에 값을 쓰거나(OUT mode일 때), GPIO 핀의 현재 값을 읽어온다.

또한, GPIO 상수들을 정의한 몇 가지 enum을 정의하였다.

  • gpio_direction_e
  • gpio_value_e
  • gpio_port_e
  • gpio_pin_e
typedef enum {
    GPIO_IN = 0,
    GPIO_OUT = 1
} gpio_direction_e;

typedef enum {
    LOW = 0,
    HIGH = 1
} gpio_value_e;

typedef enum {
  GPX0 = 0x300,
  GPX1 = 0x308,
  GPA0 = 0x00,
  GPA1 = 0x08,
  GPA2 = 0x10,
  GPD0 = 0x28,
  GPB2 = 0x28
} gpio_port_e;

typedef enum {
  GPX0_0 = (GPX0 << 3) + 0,
  GPX0_1 = (GPX0 << 3) + 1,
  /* More to be added */
  GPX1_0 = (GPX1 << 3) + 0,
  GPX1_5 = (GPX1 << 3) + 5,
  GPX1_6 = (GPX1 << 3) + 6,
  J27_11 = GPX1_0,
  J27_12 = GPX1_5,
  J27_13 = GPX1_6
  /* contunued */
} gpio_pin_e;

gpio_port_e는 하나의 레지스터로 묶이는 GPIO pin 묶임을 의미하며, gpio_pin_e는 LSB 3개에 각 핀의 offset을, 그리고 그 위의 비트에 port address를 저장한다. GPIO pin들은 ARTIK 10 개발보드 내에서의 이름을 alias로 가진다.

Example code

#include <unistd.h>
#include "gpio.h"

int main(int argc, char **argv)
{
    gpio_pin pin = J27_13;
    set_pin_mode(pin, GPIO_OUT);
    int i;
    for (i = 0; i < 10; i++) {
        set_pin_value(pin, HIGH);
        sleep(1);
        set_pin_value(pin, LOW);
        sleep(1);
    }

    return 0;
}

코드