驅動程式 - Linux Device Driver (LDD) - 使用範例 - C/C++ (PocketBeagle) - GPIO Output



PocketBeagle開發板上有四顆USR LED,此次範例將使用USR3 LED,位置如下:


Device Tree(arch/arm/boot/dts/am335x-pocketbeagle-common.dtsi)

led@5 {
    label = "beaglebone:green:usr3";
    gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>
    linux,default-trigger = "mmc1";
    default-state = "off";
};

P.S. USR3位置是GPIO1-24

Linux驅動程式可以當作是在寫韌體程式,因此,可以在驅動程式裡面直接操作GPIO暫存器,當然也可以遵循Linux Kernel規範,使用統一的GPIO操作函數,如果GPIO驅動程式沒有先移植好的話,那就只能使用暫存器的操作方式,幸運地,在這一版PocketBeagle Kernel中,已經完成GPIO驅動程式的移植,因此,此範例將使用Linux Kernel統一的GPIO操作函數

使用步驟:

1. gpio_request()
2. gpio_direction_output()
3. gpio_set_value()
4. gpio_free()

main.c

#include <linux/init.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/gpio.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Steward Fu");
MODULE_DESCRIPTION("Linux Driver");
 
#define USR3_LED ((32 * 1) + 24)

int ldd_init(void)
{
    int c = 0;

    gpio_request(USR3_LED, "USR3");
    gpio_direction_output(USR3_LED, 1);

    for (c = 0; c < 3; c++) {
        gpio_set_value(USR3_LED, 0);
        msleep(1000);
        gpio_set_value(USR3_LED, 1);
        msleep(1000);
    }

    gpio_free(USR3_LED);
    return 0;
}
 
void ldd_exit(void)
{
}
 
module_init(ldd_init);
module_exit(ldd_exit);

ldd_init: 請求GPIO資源,接著設定GPIO輸出方向,最後使用迴圈點亮LED(30次)

完成