0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

gpio子系统API详解

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:Jasonangel 2023-09-27 17:17 次阅读

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

    浏览量

    40276
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209328
  • API
    API
    +关注

    关注

    2

    文章

    1499

    浏览量

    61962
收藏 人收藏

    评论

    相关推荐

    一文搞懂Linux pinctrl/gpio子系统

    GPIO的寄存器操作。分享给刚刚接触外设bsp的小伙伴们。当然后面有时间还会分享GPIO子系统框架和pinctrl子系统框架,先知道黑盒怎么使用,然后咱再打开仔细瞅瞅。
    发表于 06-09 09:52 2694次阅读

    Linux LED子系统详解

    Linux LED子系统详解
    的头像 发表于 06-10 10:37 1539次阅读
    Linux LED<b class='flag-5'>子系统</b><b class='flag-5'>详解</b>

    GPIO应用于Linux LED子系统和输入事件侦测的具体使用方法

    的时候,用户可以直接使用Linux的LED子系统来对指定的GPIO口进行设置和操作,比如LED的亮灭或者设置触发方式等。如果是将GPIO设置为输入状态侦测输入信号的高低变化,一旦电平发生变化,内核就会
    发表于 08-24 11:28

    基于GPIO子系统的LED驱动程序分享

    Pinctrl 子系统把引脚的复用、配置抽出来,做成 Pinctrl 子系统,给 GPIO、I2C 等模块使用。让我们在使用某个引脚功能时不用去一个个查芯片手册。这会涉及 2 个对象:pin
    发表于 12-16 07:16

    怎样去使用linux下的pintcrl和gpio子系统

    pinctrl和gpio内部的原理是如何实现的?怎样去使用linux下的pintcrl和gpio子系统呢?
    发表于 03-07 13:38

    RK3399开发板的pinctrl和gpio子系统相关资料介绍

    1、RK3399—pinctrl和gpio子系统  记得以前在学习51单片机时,要控制一个GPIO输出高、低电平,就得根据对应IO寄存器每一bit的作用和含义进行配置,时钟、速率、方向、上下拉等等
    发表于 09-16 17:27

    Android开发手册—API函数详解

    Android开发手册—API函数详解
    发表于 10-17 09:01 13次下载
    Android开发手册—<b class='flag-5'>API</b>函数<b class='flag-5'>详解</b>

    基于Android开发手册—API函数详解

    基于Android开发手册—API函数详解
    发表于 10-24 09:06 18次下载
    基于Android开发手册—<b class='flag-5'>API</b>函数<b class='flag-5'>详解</b>

    Linux内核GPIO操作函数的详解分析

    本文档的主要内容详细介绍的是Linux内核GPIO操作函数的详解分析免费下载。
    发表于 01-22 16:58 28次下载

    gpio和pinctrl子系统的关系与区别

    gpio 和 pinctrl 子系统在内核里的使用率非常高,和嵌入式产品的关联非常大。从这两个子系统开始学习驱动开发是个不错的入门选择。
    的头像 发表于 03-15 11:40 4939次阅读

    嵌入式驱动开发两大子系统的使用

    本文的关注点是 gpio driver --> gpio subsystem core -> gpio consumer 这一路径,读者如果想更深入地了解 pinctrl 子系统.
    的头像 发表于 03-15 13:41 1806次阅读

    【i.MX6ULL】驱动开发6——GPIO子系统点亮LED

    本篇介绍了使用**Pinctrl子系统GPIO子系统**的方式来点亮LED,与之前的寄存器版点亮LED与设备树版点亮LED的最大区别在于不需要直接操作寄存器了,而是使用API函数来配
    的头像 发表于 05-21 21:50 3178次阅读
    【i.MX6ULL】驱动开发6——<b class='flag-5'>GPIO</b><b class='flag-5'>子系统</b>点亮LED

    RK3568pinctrl 和 gpio 子系统详解

    如果 pinctrl 子系统将 PIN 复用为 GPIO,那么接下来就要配置 gpio 子系统,且 gpio
    的头像 发表于 12-20 10:22 2776次阅读
    RK3568pinctrl 和 <b class='flag-5'>gpio</b> <b class='flag-5'>子系统</b><b class='flag-5'>详解</b>

    从Linux平台来研究GPIO软件框架

    方法,让它可以像单片机一样简单的操作 IO 口,这得益于各路 Linux 大神对系统底层的封装。 在 Linux 中有 pinctrl 和 gpio 子系统,它们提供了 API 接口给
    的头像 发表于 09-28 16:05 630次阅读
    从Linux平台来研究<b class='flag-5'>GPIO</b>软件框架

    瑞芯微RK3568-iomuxc和pinctrl子系统初窥

    pinctrl子系统作用:从设备树中获取PIN的描述信息来设置PIN的复用和电气属性,PIN可复用为I2C、SPI、GPIOgpio子系统作用:初始化
    发表于 12-20 10:10 54次下载