sysfs方式控制GPIO

使用"gpiolib"实现框架的平台可选择配置一个GPIO的sysfs用户接口,这不同于debugfs接口,因为它提供GPIO方向和值的控制,而不仅是显示gpio状态摘要,另外,它可再没有调试支持的产品级系统中使用。

为系统提供合适的硬件文档,比如,用户空间可知道GPIO23控制Flash的写保护引脚,用来保护bootloader分区。系统升级处理可能需要临时接触此保护,寿险需要导入一个GPIO,再改变它的输出状态,然后在重新使能写保护前升级代码。一般情况下,GPIO23不会被触及,内核也不需要知道它。

根据合适的硬件文档,一些系统用户空间GPIO可用来确定标准内核不知道的系统配置数据。在某些任务中,简单的用户控件GPIO驱动可能是系统真正需要的。

请注意,标准内核驱动已经有通用的“LED和按键”的GPIO任务:leds-gpio和gpio_keys,使用这些来替代直接访问GPIO,因为它们和内核框架更好的配合,这比你用户控件代码更好。

1.    GPIO在Sysfs中的路径

在/sys/class/gpio中有三类入口:

(1)  用来获取GPIO用户控件控制的控制接口

控制接口是只写的,有export和unexport。

1)    Export文件

用户空间可通过写具体的GPIO编号给此文件来请求内核导出此GPIO的控制,比如echo 19 > export,如果内核没有申请GPIO19,将会创建gpio19节点

2)    Unexport文件

“unexport”可恢复内核导出gpio节点,比如echo 19 > unexport,将删除创建的gpio19节点。

(2)  GPIO本身

GPIO信号有类似于/sys/class/gpio/gpio42/(对于GPIO42来说)和有下面的读/写属性:

1)    Direction

读取的值为“in”或“out”,此值通常被写入,写入“out”时默认输出低电平。

2)    Value

读取的值为0(低电平)或1(高电平),如果GPIO配置为输出,此值允许写,任何非零值多当做高电平。

如果引脚可配置为中断模式和如果已经配置为中断模式(看”edge”的描述),你可以轮询poll(2)此文件和再中断触发时返回。如果你使用轮询select(2),设置exceptfds中的文件描述符,在轮询poll(2)返回后,要么通过lseek(2)读取此sysfs文件最开始的地方,要么关闭此文件并重新打开它来读取数据。

3)    Edge

“edge”读取的值为“none”,“rising”,“falling”或是”both”,写这些值到此文件可以选择边沿触发模式,这样,在“value”文件上的轮询操作会返回。

4)    Active_low

读取的值为0(false)或是1(true),用于决定value中的值是否进行翻转。当值为“0”时,value中的“0”表示低电平,“1”表示高电平;当值为“1”时,value中的“1”表示低电平,“0”表示高电平。

(3)  GPIO控制器(“gpiochip实例”)

这里有17个gpiochipN,通过到arch/arm/boot/dts/qcom目录下的字符串“gpio-controller”可以查找出来。

GPIO控制有类似于/sys/class/gpio/gpiochip42/(对于从GPIO42开始实现控制的控制器)和有下面只读属性。

/sys/class/gpio/gpiochipN/

1)    Base:文件,只读

和N相同,此芯片管理的第一个GPIO编号。

2)    Label:文件,只读

设备信息,用于诊断(并不总是唯一的)

这里的1000000和modalias的值表示地址对应于msm8937-pinctrl.dtsi下面的内容:

&soc {

tlmm:pinctrl@1000000 {

compatible= "qcom,msm8937-pinctrl";

3)    Ngpio:文件,只读

此芯片管理的GPIO总数(N到N+ngpio-1)

4)    Device:目录,指chip。

Driver表示对应的驱动,怎么知道对应哪个驱动呢?发现一个方法:

Gpio:是gpiochipN的符号链接

进入drivers目录下执行su命令,就显示对应的驱动,比如这是msm8937-pinctrl

5)    Power:目录,设备供电方面的相关信息

6)    Subsystem:目录,符号链接,指向父目录

7)    Uevent:文件,读写,内核与udev(自动设备发现程序)之间的通信接口

大多数情况下,板级文档应注明每个GPIO的使用目的,但是那些编号并不总是固定的,比如子板卡的GPIO依赖于所使用的的主板或是堆叠架构中其他板而有所不同,在这种情况下,你可能需要使用gpiochip节点(尽可能结合电路图)来确认给定信号所用的GPIO编号。

2.    从内核代码中导出

内核代码可显示管理那些已通过gpio_request()申请的GPIO的导出

/* export the GPIO to userspace */导出GPIO到用户空间intgpiod_export(struct gpio_desc *desc, bool direction_may_change);/*reverse gpio_export() */gpio_expor()的逆操作,取消GPIO的导出voidgpiod_unexport(struct gpio_desc *desc);/*create a sysfs link to an exported GPIO node */创建一个sysfs连接到一个已导出的GPIO节点。intgpiod_export_link(struct device *dev, const char *name,struct gpio_desc *desc);/*change the polarity of a GPIO node in sysfs */intgpiod_sysfs_set_active_low(struct gpio_desc *desc, int value);

在一个内核驱动申请一个GPIO后,它通过gpiod_export()使它在sysfs接口可见(如gpio19).该驱动能控制信号方向是否可修改,这有助于驱动防止用户空间代码意外破坏重要的系统状态。

此显示导出有助于调试(可更容易做一些实验),也可以体用一个始终存在的接口,与文档配合作为板级支持包的一部分。

在GPIO被导出之后,gpiod_export_link()允许在sysfs文件系统的任何地方创建一个到该GPIO sysfs节点的符号链接。这样驱动就可以通过一个描述性名字,在sysfs中他们所拥有的设备下提供一个接口(到该GPIO sysfs节点的)。

Drivers can usegpiod_sysfs_set_active_low() to hide GPIO line polarity

differences between boards from user space.Polarity change can be done both

before and after gpiod_export(), andpreviously enabled poll(2) support for

either rising or falling edge will bereconfigured to follow this setting.

参考:

内核自带文档

\Documentation\gpio\sysfs.txt

Linux下用文件IO的方式操作GPIO(/sys/class/gpio)

http://blog.sina.com.cn/s/blog_7880d3350102w2um.html

linux gpio 控制 基于sysfs

http://gofly.blog.51cto.com/4344767/1685747

Documentation/gpio.txt 的中文翻译

http://blog.csdn.net/viewsky11/article/details/53192767

sysfs方式控制GPIO相关推荐

  1. linux设备树sysfs,迅为-iMX6开发板-设备树内核-sys方式控制GPIO

    本文档主要讲解迅为-iMX6 开发板,通过 sys 文件的方式来控制 GPIO. 要通过 sys 控制 GPIO,需要做以下几步操作: 1 开启内核中的"GPIO_SYSFS"驱动 ...

  2. TX2 用文件IO的方式操作GPIO

    概述 通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的 ...

  3. linux IO方式操作gpio

    转自http://blog.sina.com.cn/s/blog_7880d3350102w2um.html http://blog.csdn.net/sukhoi27smk/article/deta ...

  4. matlab控制树莓派3b,树莓派3B+ 手机h5网页控制GPIO

    ezgif-4-5d181e9b42.gif 本文介绍如何在H5页面控制树莓派GPIO 仅实现以BCM编码方式控制GPIO,其他方式未做. 演示地址:http://gpio.exmll.cn/ 点击B ...

  5. Linux控制GPIO

    接到个小需求,按开机键3s后机器开机,要实现这样的功能就需要某个GPIO输出高电平或者低电平去支持硬件电路的实现.所以,就总结下在Linux平台怎么去控制GPIO. 控制GPIO可分为在内核态和用户态 ...

  6. linux应用开发:用户空间如何通过sysfs控制GPIO

    开发环境 Ubuntu:14.04 开发板:A33-Vstar 开发板系统:linux-3.4.39 ------------------------------------------------- ...

  7. 树莓派学习笔记 ——I2C PCF8574 SysFs方式

    1.前言 树莓派的GPIO端口数量有限,可通过IO扩展芯片增加GPIO的数量,使得树莓派可以适应更多的应用.PCF8574为一款通过I2C总线扩展IO的芯片,单个PCF8574可扩展8个IO,一个I2 ...

  8. python控制gpio产生固定数量的脉冲_STM32L151用dma控制GPIO口发出指定的脉冲个数的疑惑!...

    本帖最后由 mon51 于 2015-3-6 16:41 编辑 用DMA控制GPIO的一个IO脚,输出指定脉冲的个数项目,由于要低功耗!MCU主频不能高.采用的定时器联机,还是达不到输出150KHZ的 ...

  9. linux下使用gpio控制代码,zynq linux 下控制gpio的c代码

    在linux下控制gpio可以先用简单的命令行去控制下看看, 1. devmem 0x41200000 32 0x00000005 2.devicetree的结构如下 dip0: gpio_dip_s ...

最新文章

  1. 分组查询 group by 子句及order by子句
  2. php 读取文件fread,PHP: 读取文件 fgets 和 fread 的差异
  3. python排序算法的时间复杂度_Python算法的时间复杂度和空间复杂度(实例解析)
  4. 五款中文分词工具在线PK: Jieba, SnowNLP, PkuSeg, THULAC, HanLP
  5. Codeforces Round #446 (Div. 2) D. Gluttony 构造,思维
  6. jmeter 连接mysql数据库
  7. Unity代码生成实例物体
  8. (一)Yocto的介绍
  9. vue项目利用Hbuilder打包成APP流程,以及遇到的坑
  10. 【ParaView教程】第四章 常见问题 —— 怎样用ParaView导入Star CCM+的结果?
  11. 关于Integer和int
  12. 社交电商的现状以及它的四种商业模式
  13. 三维目标识别、三维特征研究现状
  14. 再见, Python, 你好, Julia
  15. 桌面计算机右键属性不弹窗,Win7系统右键计算机属性不见了的解决方法
  16. c语言名人名言大全摘抄,数学名人名言大全摘抄
  17. 【wechat】微信开发——OAuth2.0网页授权
  18. 关于android button按键紫色
  19. 什么叫分销商_分销是什么意思?
  20. linux进程 crash 分析工具,crash工具分析大型Linux服务器死锁实战

热门文章

  1. 046_Unicode对照表十二
  2. 能用来写安卓吗_石粉能否用来制砂生产?能代替沙子使用吗?Z95
  3. Kotlin极简教程:第4章 基本数据类型与类型系统
  4. 从零开始搭建Android框架系列
  5. 找工作面试经历——校招、秋招、图像算法、求职面试之路
  6. nat端口限制_Cisco ASA 防火墙 NAT - 基本概念
  7. php编程输出心形图案_利用php输出不同的心形图案,php心形图案_PHP教程
  8. rhel 8.2不识别unicode_Unicode的文本处理二三事
  9. python3模块socket怎么安装_Python中socket模块的使用方法(一)
  10. 24c04硬件地址位_一文读懂IP地址和MAC地址有什么区别和联系