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 上去,可以发现蜂鸣器有响。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    4

    文章

    1436

    浏览量

    42505
  • Linux
    +关注

    关注

    88

    文章

    11631

    浏览量

    218023
  • API
    API
    +关注

    关注

    2

    文章

    2173

    浏览量

    66260
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一文搞懂Linux pinctrl/gpio子系统

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

    Linux LED子系统详解

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

    飞凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系统GPIO子系统

    软件控制设备上的GPIO信号。在Linux的GPIO子系统中,提供了一组API函数来管理和操作GPIO引脚。以下是一些常用的
    发表于 03-24 15:41

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系统GPIO子系统

    软件控制设备上的GPIO信号。在Linux的GPIO子系统中,提供了一组API函数来管理和操作GPIO引脚。以下是一些常用的
    发表于 03-25 13:29

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

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

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

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

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

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

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

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

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

    本篇介绍了使用**Pinctrl子系统GPIO子系统**的方式来点亮LED,与之前的寄存器版点亮LED与设备树版点亮LED的最大区别在于不需要直接操作寄存器了,而是使用API函数来配
    的头像 发表于 05-21 21:50 3980次阅读
    【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 3774次阅读
    RK3568pinctrl 和 <b class='flag-5'>gpio</b> <b class='flag-5'>子系统</b><b class='flag-5'>详解</b>

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

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

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验
    的头像 发表于 05-23 13:47 750次阅读
    RK3568驱动指南|第十二篇 <b class='flag-5'>GPIO</b><b class='flag-5'>子系统</b>-第135章 <b class='flag-5'>GPIO</b><b class='flag-5'>子系统</b>与pinctrl<b class='flag-5'>子系统</b>相结合实验

    迅为RK3568驱动指南GPIO子系统 GPIO操作函数实验

    迅为电子RK3568开发板驱动指南GPIO子系统 GPIO操作函数实验
    的头像 发表于 05-28 15:24 1054次阅读
    迅为RK3568驱动指南<b class='flag-5'>GPIO</b><b class='flag-5'>子系统</b> <b class='flag-5'>GPIO</b>操作函数实验

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入
    的头像 发表于 05-29 14:05 846次阅读
    迅为RK3568开发板驱动指南<b class='flag-5'>GPIO</b><b class='flag-5'>子系统</b><b class='flag-5'>GPIO</b><b class='flag-5'>子系统</b><b class='flag-5'>API</b>函数的引入

    RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法

    RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法
    的头像 发表于 06-03 11:32 999次阅读
    RK3568驱动指南|第十二篇 <b class='flag-5'>GPIO</b><b class='flag-5'>子系统</b>-第130章 <b class='flag-5'>GPIO</b>的调试方法