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
