开发环境
Ubuntu:14.04
开发板:A33-Vstar
开发板系统:linux-3.4.39
-----------------------------------------------------
1. 启用GPIO sysfs interface
首先看系统中有没有“/sys/class/gpio”这个文件夹。如果没有在编译内核的时候打开 Device Drivers-> GPIO Support-> /sys/class/gpio/… (sysfs interface)
2. 计算GPIO引脚编号
打开linux-3.4/arch/arm/mach-sunxi/include/mach/gpio.h
可以看到如下定义:
#define SUNXI_PA_BASE 0
#define SUNXI_PB_BASE 32
#define SUNXI_PC_BASE 64
#define SUNXI_PD_BASE 96
#define SUNXI_PE_BASE 128
#define SUNXI_PF_BASE 160
#define SUNXI_PG_BASE 192
#define SUNXI_PH_BASE 224
#define SUNXI_PI_BASE 256
#define SUNXI_PJ_BASE 288
#define SUNXI_PK_BASE 320
#define SUNXI_PL_BASE 352
#define SUNXI_PM_BASE 384
#define SUNXI_PN_BASE 416
规律:
GPIOn_x的编号为32*n+x,例如此处用的GPIO1_6的编号为32*1+6=38。
例如,我们想操作GPIO_PH7引脚,编号为:
SUNXI_PH_BASE+引脚编号,即:224+7=231
注:也可以用以下方式取得GPIO编号信息,在终端中敲入以下命令:
$ cd /sys/class/gpio  
$ for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done  
但是A33不支持。
3. GPIO控制测试
1)echo 231 > /sys/class/gpio/export
执行此命令会在gpio/下生成gpio231目录
2)echo out > gpio231/direction
设置GPIO_PH7方向为输出
3)控制
echo 1 > gpio231/value
设置GPIO_PH7为高电平
echo 0 > gpio231/value
设置GPIO_PH7为低电平
4)关闭控制
echo 231 > /sys/class/gpio/unexport
4. 说明
1)/sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号
2)/sys/class/gpio/unexport 用于通知系统取消导出
3)/sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称,引脚总数。
4)向/sys/class/gpio/export写入编号,比如12号引脚,echo 12 > /sys/class/gpio/export,命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出。
5)gpio231/下文件说明

direction 这个文件是控制你是输出还是输入模式
                如果想设置为输入:echo in > direction
                如果想设置为输出:echo out > direction
        value 这个文件是在输出模式时,控制高低电平
                高电平:echo 1 > value
                低电平:echo 0 > value
        edge 这个控制中断触发模式
                无: echo none > edge
                上升沿触发:echo rising > edge
                下降沿触发:echo falling > edge
                轮询:echo both > edge
        active_low: 这个按照官方的说法是这个翻转电平,输入非零的数即上升沿变为下降沿。
                o: echo 0 > active_low
                非零的数: echo 3 > active_low

5. 用户空间编程控制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define GPIO_PH7 231
int main(void)
{
FILE *p=NULL;
int i=0;
p = fopen("/sys/class/gpio/export","w");
fprintf(p,"%d", GPIO_PH7);
fclose(p);
p = fopen("/sys/class/gpio/gpio231/direction","w");
fprintf(p,"out");
fclose(p);
printf("running.\n\n");
for(i=0; i<50; i++)
{
printf("gpio_ph7 value is 1.\n");
p = fopen("/sys/class/gpio/gpio231/value","w");
fprintf(p,"%d",1);
sleep(1);
fclose(p);
printf("gpio_ph7 value is 0.\n");
p = fopen("/sys/class/gpio/gpio231/value","w");
fprintf(p,"%d",0);
sleep(1);
fclose(p);
}
p = fopen("/sys/class/gpio/unexport","w");
fprintf(p,"%d", GPIO_PH7);
fclose(p);
return 0;
}

linux应用开发:用户空间如何通过sysfs控制GPIO相关推荐

  1. linux内核与用户空间的九种通信机制

    目前Linux提供了9种机制完成内核与用户空间的数据交换,分别是内核启动参数.模块参数与 sysfs.sysctl.系统调用.netlink.procfs.seq_file.debugfs和relay ...

  2. linux用户空间 限制吗,在Linux中限制用户空间

    在Linux中限制用户的磁盘使用空间使用的是Quota,一般Quota在安装Linux时就已包括在内核中,不需要另行安装.Quota可以从两方面指定磁盘的储存限制: 使用者所能够支配的索引节点(ino ...

  3. 以下linux进程内存空间中按低地址,Linux 内核开发 - 进程空间

    1.1 虚拟内存 Linux 的系统.假设每一个任务都独立的占用内存,则实际的物理内存将非常快消耗殆尽.实际上对于前台正在执行的任务来说,所须要要的内存并不多,非常多任务基本不须要执行,也就没有必要一 ...

  4. Openwrt按键检测分析-窥探Linux内核与用户空间通讯机制netlink使用

    首先看一下Openwrt系统中关于按键功能的使用和修改,以18.06版本为例 按键功能实现在脚本中, 比如18.06/package/base-files/files/etc/rc.button/re ...

  5. 人间还是仙界?聊一聊linux系统的用户空间和内核空间

    我们生活在人间,但<西游记>里提到,在天上还有一个仙界. 人间不知道仙界的存在:而仙界知道人间的存在,神仙也可以从仙界下凡到人间,但是被严格管控的. 软件设计的灵感其实都来自于生活:用户空 ...

  6. Linux内核访问用户空间文件:get_fs()/set_fs()的使用

    测试环境:Ubuntu 14.04+Kernel 4.4.0-31 关键词:KERNEL_DS.USER_DS.get_fs().set_fs().addr_limit.access_ok. 参考代码 ...

  7. 4412开发板学习之Linux驱动开发(五):4412MMU及GPIO操作(点灯)

    4412MMU及GPIO操作(点灯) 物理地址与虚拟地址 与传统MCU的对比 4412中的物理地址 MMU内存管理单元 存储器分类 4412中的存储器映射 物理地址和虚拟地址 其他的地址概念 GPIO ...

  8. linux 内核空间 sy,在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysf...

    级别: 初级 燚 杨 (), 计算机科学硕士 2006 年 2 月 16 日 本系列文章包括两篇,它们文详细地介绍了 Linux 系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数.模块参数 ...

  9. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

最新文章

  1. php layui table,layui table 相关问题汇总
  2. Linux系统云主机教程,新开的linux云主机磁盘挂载教程
  3. mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)
  4. redis-java客户端jedis测试
  5. [Node.js] nodejs 连接 mysql数据库
  6. springcloud工作笔记091---tk.mybatis.mapper.MapperException: 当前实体类不包含名为XXXXX的属性!
  7. 鱼腥草可以随便吃吗?
  8. 接口加密了该怎么测?
  9. Ubuntu Server 16.04 安装并用两块硬盘做RAID1
  10. 对象tostring后怎么转成对象_和女生相亲后怎么联系对方?和相亲对象该如何聊天...
  11. Springboot2.x 拦截器
  12. 关于idea中运行maven项目报错显示找不到包或符号的问题——终极方案
  13. Scapy 中文文档:三、使用方法
  14. 使用maven打jar包
  15. 2021微信网页跳转APP
  16. java收割者模式,烧饼丶收割者的动态
  17. Asio Threads and Asio
  18. Dissect RB-Tree
  19. 京东到家订单中心ES演进
  20. java的markword_【转帖】Java工具结构与锁实现原理及MarkWord详解

热门文章

  1. Ruby中如何识别13位的时间戳
  2. 大规模部署桌面虚拟化时的问题
  3. Xampp里Mysql服务启动不起来,错误1067
  4. spring aop与strut2的拦截器冲突
  5. 用递归求最大值PHP,php如何使用递归来计算一个目录中所有文件的大小(代码)...
  6. 中反应器体积_实验室规模半连续和连续生物反应器在微生物学和生物技术工艺中的作用...
  7. 你有一笔新订单 语音_坐电梯动口不动手,浦东企业新技术实现乘坐电梯“零接触”!...
  8. Codeforces Round #639 (Div. 2)(AB)
  9. lisp方格网法计算土方量_CAD土方软件方格网法与三角网法相结合,准确计算土方量...
  10. leetcode 滴滴_一个菜逼程序媛的求职历程(秋招已拿阿里、网易、滴滴等校招offer)...