Documentation

先從documentation消化一點介紹: A "General Purpose Input/Output" (GPIO) is a flexible software-controlled digital signal。 既然是數位訊號數位訊號在computer science,那就是只有0(low)/1(high),在embedded 平台上是常用且好用的東西。SoC上會有一堆GPIO,多達一百多根,沒有被設為alternative function (註1)的都可以拿來GPIO。從schematics上看就是一個點,從CPU拉出來,可能拉到power button設為XEINT當wakeup event,或是拉到analog codec設gpi當jack detect,或是設成gpo用來表示目前系統狀態 (1: normal; 0 suspend)。

GPIO的用途大概有以下幾種:

1. alternative function: 這是特定的function,如camera,hdmi,keypad。以hdmi為例,可以接到hdmi的hpd當hot plug detect,或是cec做進階控制,不過這些gpio都會有另外的driver來控制。以keypad為例,就可以藉由gpio的high/low來mapping按了哪個key。

2. GPI: input/output的方向是對CPU而言,因此GPI就是從外部給CPU signal,比如說EC。舉個例好了,EC控制power button,按下後,EC就將某個GPI拉high,此時CPU收到high後,trigger wakeup source,系統就resume。

3. GPO: 對照GPI,GPO就是由CPU發出來的。同樣用EC當例子,EC也控了LED。當系統進入suspend,就把某根接到EC的GPO拉low。EC收到後,就把LED變成橘色。

GPIO怎麼用,在不同的系統,不同的應用會有不同的用法。

KERNEL

GPIO相關的API都定義在

#include <linux/gpio.h>

sample code:

1.為避免不同的driver同時設定同一根GPIO,所以先用gpio_request看看是否有人使用。之後再用s3c_gpio_cfgpin設為GPI,然後拉NONE。

        err = gpio_request(S5PV2XX_GPH3(7),"GPH3");
        if (err){
                printk("gpio request error : %d\n",err);
        }else{
                s3c_gpio_cfgpin(S5PV2XX_GPH3(7),S3C_GPIO_INPUT);
                s3c_gpio_setpull(S5PV2XX_GPH3(7), S3C_GPIO_PULL_NONE);
        }

2.設為GPO,並拉low (0), high (1)

gpio_direction_output(S5PV2XX_GPH0(7), 0);
gpio_direction_output(S5PV2XX_GPH0(7), 1);

3.  設為EINT wakeup source。先設為EINT後,再投為wakeup source,掛handler。

        err = gpio_request(S5PV2XX_GPH3(7),"GPH3");
        if (err){
                printk("gpio request error : %d\n",err);
        }else{
                s3c_gpio_cfgpin(S5PV2XX_GPH3(7),S5PV2XX_GPH3_7_EXT_INT33_7);
                s3c_gpio_setpull(S5PV2XX_GPH3(7), S3C_GPIO_PULL_NONE);
        }

        set_irq_type(IRQ_EINT(31), IRQF_TRIGGER_FALLING);
        setup_irq(IRQ_EINT(31), &s3c_button_irq);
        set_irq_wake(IRQ_EINT(31), 1);

 

REFERENCE

gpio.txt

arrow
arrow
    全站熱搜

    kezeodsnx 發表在 痞客邦 留言(1) 人氣()