天天看點

gpiolib庫

1:什麼是gpiolib,為什麼要有gpiolib?

linux中從2.6.35以後就開始有gpiolib庫了,gpiolib的作用是對所有的gpio實行統一管理,因為驅動在工作的時候,會出現好幾個驅動共同使用同一個gpio的情況;

這會造成混亂。是以核心提供了一些方法來管理gpio資源;

2:如何學習gpiolib

第一:gpiolib庫的建立;

第二:gpiolib庫的使用方法:申請、使用、釋放;

3:下面看一下常用的接口

gpio_request:驅動中要想使用某一個gpio,就必須先調用gpio_request接口來向核心申請,得到允許後才可以去使用這個gpio

gpio_free: 對應gpio_request,用來釋放申請後用完了的gpio

gpiochip_is_requested: 接口用來判斷某一個gpio是否已經被申請了

gpio_direction_input/gpio_direction_output: 接口用來設定GPIO為輸入/輸出模式(不推薦直接設定寄存器)

gpio_get_value:接口用來擷取gpio目前狀态

gpio_set_value:接口用來設定gpio目前狀态

4:下面是gpiolib應用的完整代碼

#include <linux/module.h>
#include <linux/init.h>
#include <linux/leds.h>
#include <mach/gpio.h>

#define GPIO_LED	S5PV210_GPJ0(3)

static struct led_classdev mydev;

static void s5pv210_led_set(struct led_classdev *led_cdev, enum led_brightness value)
{
	printk(KERN_INFO "s5pv210_led_set\n");
	
	/* 設定gpio狀态 */
	if (value == LED_OFF)
		gpio_set_value(GPIO_LED, 1);
	else
		gpio_set_value(GPIO_LED, 0);
}

static int __init s5pv210_led_init(void)
{
	int ret = -1;

	/* 申請gpio資源 */
	if (gpio_request(GPIO_LED, "led_gpj0.3"))
	{
		printk(KERN_ERR "gpio_request failed\n");
		return -EINVAL;
	}

	/* 設定gpio方向為輸出 */
	gpio_direction_output(GPIO_LED, 1);
	
	mydev.name = "led";
	mydev.brightness = 0;	
	mydev.brightness_set = s5pv210_led_set;
	
	/* 注冊led裝置 */
	ret = led_classdev_register(NULL, &mydev);
	if (ret < 0) {
		printk(KERN_ERR "led_classdev_register failed\n");
		return ret;
	}
	
	return 0;
}

static void __exit s5pv210_led_exit(void)
{
	/* 登出led裝置 */
	led_classdev_unregister(&mydev);
	
	/* 釋放gpio資源 */
	gpio_free(GPIO_LED);
}

module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);

// MODULE_xxx這種宏作用是用來添加子產品描述資訊
MODULE_LICENSE("GPL");							// 描述子產品的許可證
MODULE_AUTHOR("lsm");							// 描述子產品的作者
MODULE_DESCRIPTION("s5pv210 led driver");		// 描述子產品的介紹資訊
MODULE_ALIAS("s5pv210_led");					// 描述子產品的别名資訊

           

5:檢視led裝置

安裝好led驅動之後,進入/sys/class/leds/led

gpiolib庫