gpio 子系统 API
gpio 子系统中操作一个 GPIO 需要如下几步:
1、of_find_compatible_node
2、of_get_named_gpio
3、gpio_request
4、控制gpio(gpio_direction_input、gpio_direction_output……)
5、gpio_free
1)of_find_compatible_node 函数在设备树中根据 device_type 和 compatible 这两个属性查找指定的节点,此处是为了获取在设备树中设置的 GPIO 的节点句柄。如果其他地方有获得句柄,那么可以直接使用这个句柄。
2) of_get_named_gpio ,获取所设置的 gpio number。
3) gpio_request ,请求这个 gpio 。如果其他地方请求了这个 gpio,还没有释放,那么我们会请求不到。
4)请求到这个 gpio 以后,我们就可以对它进行操作,比如获取到它的值,设置它的值。
5)使用完以后,释放这个 gpio。
原理图:
博主手里有一个 正点原子 imx6ull 开发板,查原理图,发现蜂鸣器直连的 GPIO 是 GPIO5_1。我把此 IO 口拉低,蜂鸣器就会响。
在设备树中增加如下代码(imx6ull-alientek-emmc.dts)
test:test {
compatible = "Jason_hello";
hello = < &gpio5 1 GPIO_ACTIVE_HIGH >;
};
设置 GPIO 为 GPIO5_1,高电平有效,但实际上第三个参数我没有使用。
gpio.c
#include < linux/init.h >
#include < linux/kernel.h >
#include < linux/module.h >
#include < linux/gpio.h >
#include < linux/of.h >
#include < linux/of_gpio.h >
static int __init mypinctrl_init(void)
{
int gpionum = 0;
int ret = 0;
struct device_node *node = NULL;
node = of_find_compatible_node(NULL,NULL,"Jason_hello");
if(!node){
printk("get node errorn");
return ret;
}
gpionum = of_get_named_gpio(node,"hello",0);
if(gpionum < 0){
printk("get gpionum errorn");
return ret;
}
ret = gpio_request(gpionum,"hello");
if(ret){
printk("gpio_request errorn");
return ret;
}
printk("gpio(%d) value = %dn",gpionum,ret);
ret = gpio_get_value(gpionum);
printk("gpio(%d) value = %dn",gpionum,ret);
gpio_direction_output(gpionum,0); // 设置 gpio 输出低电平
ret = gpio_get_value(gpionum);
printk("gpio(%d) value = %dn",gpionum,ret);
return 0;
}
static void __exit mypinctrl_exit(void)
{
printk("%sn",__func__);
}
module_init(mypinctrl_init);
module_exit(mypinctrl_exit);
MODULE_LICENSE("GPL");
Makefile
KERNELDIR := /home/book/linux/tool/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
CURRENT_PATH := $(shell pwd)
obj-m := gpio.o
build: kernel_modules
kernel_modules:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
在 Linux 内核源码根目录中输入 make dtbs,编译一份设备树,下载进开发板。
在 kernel/drivers/misc/ 中新建文件夹,命名为 mygpio,里面放置 gpio.c 和 Makefile。然后输入 make 编译出 gpio.ko。然后拷贝进板子,insmod 上去,可以发现蜂鸣器有响。
-
内核
+关注
关注
3文章
1372浏览量
40289 -
Linux
+关注
关注
87文章
11304浏览量
209487 -
API
+关注
关注
2文章
1500浏览量
62015
发布评论请先 登录
相关推荐
评论