gpio 子系統(tǒng) API
gpio 子系統(tǒng)中操作一個(gè) 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 函數(shù)在設(shè)備樹中根據(jù) device_type 和 compatible 這兩個(gè)屬性查找指定的節(jié)點(diǎn),此處是為了獲取在設(shè)備樹中設(shè)置的 GPIO 的節(jié)點(diǎn)句柄。如果其他地方有獲得句柄,那么可以直接使用這個(gè)句柄。
2) of_get_named_gpio ,獲取所設(shè)置的 gpio number。
3) gpio_request ,請(qǐng)求這個(gè) gpio 。如果其他地方請(qǐng)求了這個(gè) gpio,還沒有釋放,那么我們會(huì)請(qǐng)求不到。
4)請(qǐng)求到這個(gè) gpio 以后,我們就可以對(duì)它進(jìn)行操作,比如獲取到它的值,設(shè)置它的值。
5)使用完以后,釋放這個(gè) gpio。
原理圖:
博主手里有一個(gè) 正點(diǎn)原子 imx6ull 開發(fā)板,查原理圖,發(fā)現(xiàn)蜂鳴器直連的 GPIO 是 GPIO5_1。我把此 IO 口拉低,蜂鳴器就會(huì)響。
在設(shè)備樹中增加如下代碼(imx6ull-alientek-emmc.dts)
test:test {
compatible = "Jason_hello";
hello = < &gpio5 1 GPIO_ACTIVE_HIGH >;
};
設(shè)置 GPIO 為 GPIO5_1,高電平有效,但實(shí)際上第三個(gè)參數(shù)我沒有使用。
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); // 設(shè)置 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 內(nèi)核源碼根目錄中輸入 make dtbs,編譯一份設(shè)備樹,下載進(jìn)開發(fā)板。
在 kernel/drivers/misc/ 中新建文件夾,命名為 mygpio,里面放置 gpio.c 和 Makefile。然后輸入 make 編譯出 gpio.ko。然后拷貝進(jìn)板子,insmod 上去,可以發(fā)現(xiàn)蜂鳴器有響。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1408瀏覽量
41088 -
Linux
+關(guān)注
關(guān)注
87文章
11456瀏覽量
212755 -
API
+關(guān)注
關(guān)注
2文章
1559瀏覽量
63511
發(fā)布評(píng)論請(qǐng)先 登錄
一文搞懂Linux pinctrl/gpio子系統(tǒng)
飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之GPIO子系統(tǒng)
嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之GPIO子系統(tǒng)
基于GPIO子系統(tǒng)的LED驅(qū)動(dòng)程序分享
怎樣去使用linux下的pintcrl和gpio子系統(tǒng)呢
gpio和pinctrl子系統(tǒng)的關(guān)系與區(qū)別
【i.MX6ULL】驅(qū)動(dòng)開發(fā)6——GPIO子系統(tǒng)點(diǎn)亮LED

RK3568pinctrl 和 gpio 子系統(tǒng)詳解

瑞芯微RK3568-iomuxc和pinctrl子系統(tǒng)初窺
RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實(shí)驗(yàn)

迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng) GPIO操作函數(shù)實(shí)驗(yàn)

迅為RK3568開發(fā)板驅(qū)動(dòng)指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數(shù)的引入

評(píng)論