1. 程式人生 > >轉:linux GPIO驅動

轉:linux GPIO驅動

Linux 下驅動GPIO 其實不用自己寫,最近專案要用到開發板上的GPIO,搜尋了一番,發現linux 下實現GPIO 驅動實在是太方便了,有現成的framework 可用,基本上要做的事情就是定義一下
Linux 下通過框架實現LED 大致過程如下
1、實現框架要求的幾個函式
int gpio_request(unsigned gpio, const char *label)
void gpio_free(unsigned gpio)
int gpio_direction_input(unsigned gpio)
int gpio_direction_output(unsigned gpio, int value)
int gpio_get_value(unsigned gpio)
void gpio_set_value(unsigned gpio, int value)
int gpio_to_irq(unsigned gpio)
int irq_to_gpio(unsigned irq)
這幾個函式是硬體相關的,具體實現就跟硬體管腳有關了
2、在結構 gpio_led 中定義gpio 的名字,並跟gpio 管腳關聯起來,然後在初始時用函式platform_add_devices加到系統中
3、使用時對 /sys/class/leds 下的檔案介面設定相應的值即可
舉個例子,例如有1個LED 燈,需要實現如下功能
亮,滅,慢閃,快閃
首先實現
int gpio_request(unsigned gpio, const char *label)
void gpio_free(unsigned gpio)
int gpio_direction_input(unsigned gpio)
int gpio_direction_output(unsigned gpio, int value)
int gpio_get_value(unsigned gpio)
void gpio_set_value(unsigned gpio, int value)
int gpio_to_irq(unsigned gpio)
int irq_to_gpio(unsigned irq)

然後定義
/* LEDS */
static struct gpio_led default_leds[] = {
        { .name = "myboard:led0", .gpio = 4,.default_trigger = "timer" ,},
};

static struct gpio_led_platform_data myboard_led_data = {
    .num_leds = ARRAY_SIZE(default_leds),
    .leds = default_leds,
};

static struct platform_device myboard_leds = {
    .name = "leds-gpio",
    .id = -1,
    .dev = {
        .platform_data = &myboard_led_data,
    }
};

static struct platform_device *myboard_devs[] = {
    &myboard_leds,
};

static int __init my_board_setup(void)
{
    return platform_add_devices(myboard_devs, ARRAY_SIZE(myboard_devs));
}

arch_initcall(my_board_setup);

要常亮 echo 1 > /sys/class/leds/myboard:led0/brightness
要熄滅 echo 0 > /sys/class/leds/myboard:led0/brightness
要快閃
echo 125 > /sys/class/leds/myboard:led0/delay_on
echo 375 > /sys/class/leds/myboard:led0/delay_off
要慢閃
echo 250 > /sys/class/leds/myboard:led0/delay_on
echo 750 > /sys/class/leds/myboard:led0/delay_off