sysfs方式控制GPIO
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相关推荐
- linux设备树sysfs,迅为-iMX6开发板-设备树内核-sys方式控制GPIO
本文档主要讲解迅为-iMX6 开发板,通过 sys 文件的方式来控制 GPIO. 要通过 sys 控制 GPIO,需要做以下几步操作: 1 开启内核中的"GPIO_SYSFS"驱动 ...
- TX2 用文件IO的方式操作GPIO
概述 通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的 ...
- linux IO方式操作gpio
转自http://blog.sina.com.cn/s/blog_7880d3350102w2um.html http://blog.csdn.net/sukhoi27smk/article/deta ...
- matlab控制树莓派3b,树莓派3B+ 手机h5网页控制GPIO
ezgif-4-5d181e9b42.gif 本文介绍如何在H5页面控制树莓派GPIO 仅实现以BCM编码方式控制GPIO,其他方式未做. 演示地址:http://gpio.exmll.cn/ 点击B ...
- Linux控制GPIO
接到个小需求,按开机键3s后机器开机,要实现这样的功能就需要某个GPIO输出高电平或者低电平去支持硬件电路的实现.所以,就总结下在Linux平台怎么去控制GPIO. 控制GPIO可分为在内核态和用户态 ...
- linux应用开发:用户空间如何通过sysfs控制GPIO
开发环境 Ubuntu:14.04 开发板:A33-Vstar 开发板系统:linux-3.4.39 ------------------------------------------------- ...
- 树莓派学习笔记 ——I2C PCF8574 SysFs方式
1.前言 树莓派的GPIO端口数量有限,可通过IO扩展芯片增加GPIO的数量,使得树莓派可以适应更多的应用.PCF8574为一款通过I2C总线扩展IO的芯片,单个PCF8574可扩展8个IO,一个I2 ...
- python控制gpio产生固定数量的脉冲_STM32L151用dma控制GPIO口发出指定的脉冲个数的疑惑!...
本帖最后由 mon51 于 2015-3-6 16:41 编辑 用DMA控制GPIO的一个IO脚,输出指定脉冲的个数项目,由于要低功耗!MCU主频不能高.采用的定时器联机,还是达不到输出150KHZ的 ...
- linux下使用gpio控制代码,zynq linux 下控制gpio的c代码
在linux下控制gpio可以先用简单的命令行去控制下看看, 1. devmem 0x41200000 32 0x00000005 2.devicetree的结构如下 dip0: gpio_dip_s ...
最新文章
- 分组查询 group by 子句及order by子句
- php 读取文件fread,PHP: 读取文件 fgets 和 fread 的差异
- python排序算法的时间复杂度_Python算法的时间复杂度和空间复杂度(实例解析)
- 五款中文分词工具在线PK: Jieba, SnowNLP, PkuSeg, THULAC, HanLP
- Codeforces Round #446 (Div. 2) D. Gluttony 构造,思维
- jmeter 连接mysql数据库
- Unity代码生成实例物体
- (一)Yocto的介绍
- vue项目利用Hbuilder打包成APP流程,以及遇到的坑
- 【ParaView教程】第四章 常见问题 —— 怎样用ParaView导入Star CCM+的结果?
- 关于Integer和int
- 社交电商的现状以及它的四种商业模式
- 三维目标识别、三维特征研究现状
- 再见, Python, 你好, Julia
- 桌面计算机右键属性不弹窗,Win7系统右键计算机属性不见了的解决方法
- c语言名人名言大全摘抄,数学名人名言大全摘抄
- 【wechat】微信开发——OAuth2.0网页授权
- 关于android button按键紫色
- 什么叫分销商_分销是什么意思?
- linux进程 crash 分析工具,crash工具分析大型Linux服务器死锁实战
热门文章
- 046_Unicode对照表十二
- 能用来写安卓吗_石粉能否用来制砂生产?能代替沙子使用吗?Z95
- Kotlin极简教程:第4章 基本数据类型与类型系统
- 从零开始搭建Android框架系列
- 找工作面试经历——校招、秋招、图像算法、求职面试之路
- nat端口限制_Cisco ASA 防火墙 NAT - 基本概念
- php编程输出心形图案_利用php输出不同的心形图案,php心形图案_PHP教程
- rhel 8.2不识别unicode_Unicode的文本处理二三事
- python3模块socket怎么安装_Python中socket模块的使用方法(一)
- 24c04硬件地址位_一文读懂IP地址和MAC地址有什么区别和联系