[Linux应用]通过sysfs在用户空间使用GPIO中断

news/2024/7/8 8:48:05
通过使用sysfs,Linux GPIO可以支持在用户空间进行GPIO的控制或获取状态。这样可以使用简单的工具,比如“echo”来设置输出GPIO的电平或使用“cat”来读取输入GPIO的当前值。
1、配置内核中sysfs下的GPIO支持
       要想在用户空间访问GPIO,需要在sysfs中使能GPIO支持。
Symbol: GPIO_SYSFS [=n]
  Type  : boolean
  Prompt: /sys/class/gpio/... (sysfs interface)
  Defined at drivers/gpio/Kconfig:51
  Depends on: GPIOLIB [=y] && SYSFS [=y] && EXPERIMENTAL [=y]
  Location:
   -> Device Drivers
     -> GPIO Support (GPIOLIB [=y])
2、在用户空间是能GPIO
       即将GPIO导出到用户空间之中。
------------------------------------
GPIO = 22
cd = /sys/class/gpio
ls
echo $GPIO > export
ls
------------------------------------
       注意:开始ls时,gpio22并不存在,第二个ls时,gpio22才存在。
       设置为输入并获取当前值:
------------------------------------
cd /sys/class/gpio/gpio$GPIO
echo "in" > direction
cat value
------------------------------------
       设置为输出并设置值:
------------------------------------
cd /sys/class/gpio/gpio$GPIO
echo "out" > direction
echo 1 > value 或 echo 0 > value
------------------------------------
3、用作中断
       先将GPIO配置为输入,然后使用poll()来阻塞程序直到GPIO的输入电平发生改变,关键是使用POLLPRI而不是POLLIN来侦听事件;或者使用select()。
4、查看GPIO配置
       配置内核来使能debugfs
 Symbol: DEBUG_FS [=y]
  Type  : boolean
  Prompt: Debug Filesystem
    Defined at lib/Kconfig.debug:77
    Location:
    -> Kernel hacking
       启动目标硬件并挂载debugfs
mount -t debugfs none /sys/kernel/debug
       查看引脚配置
cat /sys/kernel/debug/gpio

poll示例:
memset((void *)xfds, 0, sizeof(xfds));
xfds[0].fd = fd;
xfds[0].events = POLLPRI;
ret = poll(xfds, 1, -1);
if(ret <= 0)
ERREXIT("poll value");
if(xfds[0].revents & POLLPRI)
{
/* get value */
ret = lseek(fd, 0, SEEK_SET);
if(ret < 0)
ERREXIT("lseek value");
ret = read(fd, buf, 2);
buf[1] = '\0';
printf("read ret = %d, value = %s\n", ret, buf);
if(ret != 2)
ERREXIT("read value");
}

select示例:
FD_ZERO(&exceptfds);
FD_SET(fd, &exceptfds);
ret = select(fd+1,NULL,NULL,&exceptfds,NULL);
if(ret < 0)
ERREXIT("select value");
//else if(ret > 0)
if(ret > 0)
{
/* get value */
ret = lseek(fd, 0, SEEK_SET);
if(ret < 0)
ERREXIT("lseek value");
ret = read(fd, buf, 2);
buf[1] = '\0';
printf("read ret = %d, value = %x\n", ret, buf[0]);
if(ret != 2)
ERREXIT("read value");
}

http://www.niftyadmin.cn/n/2896003.html

相关文章

Zabbix自动添加Mysql多实例监控

1、定义每个实例的端口 cat mysql_port 3306 3307 3308 3309 33103311 3312 3313 2、给所有实例创建一个zabbix用户只允许本地访问&#xff0c;生产环境具体权限各位看官自己看着给吧O(∩_∩)O GRANT ALL PRIVILEGES ON *.* TO zabbix127.0.0.1 IDENTIFIED BY zabbix; 3、创建…

Linux文件系统初步

&#xff08;一&#xff09;准备工作 1&#xff0c;虚拟机网卡选择桥接网络&#xff0c;同时在虚拟网络编辑器中设置桥接接口 &#xff08;二&#xff09;远程连接Linux Linux支持远程连接&#xff0c;它是基于ssh&#xff0f;secure shell协议进行的 1&#xff0c;首先输入命令…

Wireshark获取邮件内容

收发邮件的协议客户端为smtp、pop&#xff0c;web浏览器为http&#xff0c;这里过滤http包&#xff0c;发现main.jsp&#xff08;管理后台的页面&#xff0c;可能是index.php、main.php、manage.php、guanli.php&#xff09; 在readhtml.jsp中得到答案 请求中有accept-encoding…

为故障而设计:AWS S3云存储故障给我们的启示

如今 2017 年&#xff0c;云是重要业务技术选型的最好选择。使用云也为管理基础设施带来了很多益处&#xff0c;包括提升灵活性、可扩展性&#xff0c;同时降低了 IT 成本。但是上周我们目睹了 AWS S3 停机故障 [1]&#xff0c;看来即使是最可靠的服务提供商也可能遇到倒霉的一…

baseValidate

转载于:https://www.cnblogs.com/finddata/p/10930740.html

Java中间缓存变量

Java中间缓存变量&#xff0c;在看《Java面试宝典》时&#xff0c;看到面试例题&#xff0c;关于Java缓存变量&#xff0c;一直一脸茫然&#xff0c;查了部分资料&#xff0c;在这里和大家分享一下。题目&#xff1a; public class Test {public static void main(String[] arg…

[网络流24题(1/24)] 最小路径覆盖问题(洛谷P2764)

传送门 分析&#xff1a; 本题的结论是&#xff1a;最小路径覆盖顶点数-原图的最大匹配数 证明&#xff08;逼逼&#xff09; &#xff1a; 对于$1$对由$1$条边覆盖的点而言&#xff0c;$点数-1边数$ 倘若对于$n$个由$m$边所覆盖的点而言&#xff0c;则等价于把上述式子归纳&am…

201521123070 《JAVA程序设计》第3周学习总结

1. 本章学习总结 初学面向对象&#xff0c;会学习到很多碎片化的概念与知识。尝试学会使用思维导图将这些碎片化的概念、知识组织起来。请使用纸笔或者下面的工具画出本周学习到的知识点。截图或者拍照上传。 http://naotu.baidu.com/file/9fe346029d5b41fae0d11c63e93b639a?t…