GPIO 제어 구조


- GPIO(general purpose input output)란?

* GPIO는 프로세서에서 노출되는 하나의 연결 단자를 입력이나 출력으로 고정시키지 않고 선택적으로 사용할 수 있게 융통성을 높인 범용 입출력 단자.

* GIPO 중 일부는 SPI, I2C, I2S, PWM, UART와 같은 특정 기능 구성 가능.




GPIO 제어 API








GPIO LED 제어 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
 
#include <linux/gpio.h>
 
//led pin number
int led[] = { 14,15, };
 
static int led_init(void)
{
    int ret = 0;
    int i;
 
    for (i = 0; i < ARRAY_SIZE(led); i++) {
 
        //gpio 할당 요청
        ret = gpio_request(led[i], "gpio led");
        if(ret){
            printk("FAILED Request gpio %d. error : %d \n", led[i], ret);
        } else {
            // 출력으로 설정
            gpio_direction_output(led[i], 0);
        }
    }
    return ret;
}
 
static void led_exit(void)
{
    int i;
 
    for (i = 0; i < ARRAY_SIZE(led); i++){
        //gpio 입력
        gpio_set_value(led[i], 0);
        //gpio 해제
        gpio_free(led[i]);
    }
}
 
static void led_set_data(int data)
{
    int i;
 
    for(i = 0; i < ARRAY_SIZE(led); i++){
        //gpio 입력
        gpio_set_value(led[i], (data & (0x01 << i)) != 0);
    }
 
    printk("%s, data = %d\n", __FUNCTION__, data);
}
 
static int mod_hw_led_init(void)
{
    int ret;
    int i;
 
    ret = led_init();
    if(ret == 0){
        for(i = 1; i < 4++i){
            led_set_data(i);
            mdelay(1000);
        }
 
        led_set_data(0);
    }
    // 사용자 공간에서 접근할 수 있도록 sysfs에 노출
    gpio_export(141);
 
    return 0;
}
 
static void mod_hw_led_exit(void)
{
    led_exit();
}
 
module_init(mod_hw_led_init);
module_exit(mod_hw_led_exit);
 
 
EXPORT_SYMBOL(led_set_data);
MODULE_AUTHOR("PlanX Studio");
MODULE_DESCRIPTION("mod_hw_led");
MODULE_LICENSE("Dual BSD/GPL");
 
cs




요약


- GPIO는 프로세서에서 노출되는 하나의 연결 단자를 입력이나 출력으로 고정시키지 않고 선택적으로 사용할 수 있게 융통성을 높인 범용 입출력 단자

- gpio_request() 할당 및 검사

- gpio_free() 제거

- gpio_direction_input() 입력 지정

- giop_direction_output() 출력 지정

- gpio_get_value() 값 읽기

- gpio_set_value() 값 쓰기

- gpio_export() 사용자 공간에서 접근할 수 있도록  sysfs에 노출

- gpio_to_irq() gpio 번호를 irq번호로 변환




출처 : 인지소프트웨어 기술포럼 ( 전유진 강사님 수업자료)


'임베디드 > 디바이스 드라이버' 카테고리의 다른 글

Misc 디바이스 드라이버1  (0) 2017.12.26
디바이스 드라이버 구조  (0) 2017.12.26
SYSFS  (1) 2017.12.26
PROCFS  (0) 2017.12.22
커널 모듈 구현  (0) 2017.12.21

+ Recent posts