内核GPIO操作库函数
作用:内核便于驱动开发者操作GPIO(输入和输出操作)提供了相关的库函数;
gpio _request (int gpio, char *name);
函数作用:
明确:
硬件GPIO对于内核来说像内存一样,都是一种宝贵的资源,所以如果软件要访问,首先应该向内核去申请硬件GPIO资源;
明确:
每一个硬件GPIO由厂家定义好了一个名称,例如GPC0_3,但是在内核中,内核会重新给这个硬件GPIO给定义软件编号(身份证号),例如:
S5PV210_GPC0(3);
GPIO:GPF1_3,GPC0_4对应的软件编号为:S5PV210_GPF1(3),S5PV210_GPC0(4)
参数说明:
gpio:硬件GPIO对应的软件编号
name:标签,字符串
gpio_free(int gpio);
功能:如果GPIO资源不再使用,一定要释放
gpio:硬件GPIO对应的软件编号
gpio_direction_output(int gpio, int value);
功能:配置GPIO为输出,并且输出value值
gpio:硬件GPIO对应的软件编号
value:输出的状态(1,0)
gpio_direction_input(int gpio);
功能:配置GPIO为输入
gpio:硬件GPIO对应的软件编号
gpio_set_value(int gpio, int value);
功能:设置GPIO的状态,前提GPIO为输出口
gpio:硬件GPIO对应的软件编号
value:输出的状态(1,0)
int gpio_get_value(int gpio);
功能:获取GPIO的状态
返回值就是GPIO的状态值
涉及的头文件:
#include <asm/gpio.h>
#include <plat/gpio-cfg.h>
案例
用户需求:
1.加载驱动模块,点亮所有的灯;
2.卸载驱动模块,关闭所有的灯;
LED1->硬件GPIO:GPC1_3->软件编号:S5PV210_GPC1(3)
LED2->硬件GPIO: GPC1_4->软件编号:S5PV210_GPC1(4)
#include <linux/init.h>
#include <linux/module.h>
#include <asm/gpio.h>
#include <plat/gpio-cfg.h>
//声明描述LED硬件相关的数据结构
struct led_resource {
char *name; //硬件GPIO的名称
int gpio; //硬件GPIO对应的软件编号
};
//定义初始化2个LED的硬件信息
static struct led_resource led_info[] = {
[0] = {
.name = "LED1",
.gpio = S5PV210_GPC0(3)
},
[1] = {
.name = "LED2",
.gpio = S5PV210_GPC0(4)
}
};
static int led_init(void)
{
int i;
//申请GPIO资源
//配置GPIO为输出口,输出1
for (i = 0; i < ARRAY_SIZE(led_info); i++) {
gpio_request(led_info[i].gpio, led_info[i].name);
gpio_direction_output(led_info[i].gpio, 1);
}
return 0;
}
static void led_exit(void)
{
int i;
//输出0
//释放GPIO资源
for (i = 0; i < ARRAY_SIZE(led_info); i++) {
gpio_set_value(led_info[i].gpio, 0);
gpio_free(led_info[i].gpio);
}
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");