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为输入/输出模式(不推荐直接设置寄存器)

扫描二维码关注公众号,回复: 5182972 查看本文章

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

猜你喜欢

转载自blog.csdn.net/lushoumin/article/details/86501785
今日推荐