文件IO方式操作GPIO
来源:互联网 发布:cad制作软件 编辑:程序博客网 时间:2024/06/17 03:30
原文地址:http://blog.csdn.net/xukai871105/article/details/38456079
0 前言
0 前言
本文描述如果通过文件IO sysfs方式控制EasyARM GPIO端口。通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入。
Linux学习可从应用出发,先不纠结Linux驱动编写,先把Linux给玩起来。
【相关博文】
【EasyARM i.mx28学习笔记——安装和使用tftp】
【树莓派学习笔记——Shell脚本操作GPIO】
【 Linux学习笔记——例说makefile 索引博文】
【代码仓库】
代码仓库位于bitbucket——easyarm-gpio-sysfs,请使用Hg克隆或者直接下载zip包。请不要使用任何版本的IE浏览器访问链接,除非你已经知道所使用的IE浏览器符合HTML5标准。推荐使用谷歌或者火狐浏览器访问,若使用国产双核浏览器请切换到极速模式。
1 暴露GPIO操作接口
- static int gpio_export(int pin)
- {
- char buffer[BUFFER_MAX];
- int len;
- int fd;
- fd = open("/sys/class/gpio/export", O_WRONLY);
- if (fd < 0) {
- fprintf(stderr, "Failed to open export for writing!\n");
- return(-1);
- }
- len = snprintf(buffer, BUFFER_MAX, "%d", pin);
- if (write(fd, buffer, len) < 0) {
- fprintf(stderr, "Fail to export gpio!");
- return -1;
- }
- close(fd);
- return 0;
- }
2 隐藏GPIO操作接口
- static int gpio_unexport(int pin)
- {
- char buffer[BUFFER_MAX];
- int len;
- int fd;
- fd = open("/sys/class/gpio/unexport", O_WRONLY);
- if (fd < 0) {
- fprintf(stderr, "Failed to open unexport for writing!\n");
- return -1;
- }
- len = snprintf(buffer, BUFFER_MAX, "%d", pin);
- if (write(fd, buffer, len) < 0) {
- fprintf(stderr, "Fail to unexport gpio!");
- return -1;
- }
- close(fd);
- return 0;
- }
3 配置GPIO方向
- static int gpio_direction(int pin, int dir)
- {
- static const char dir_str[] = "in\0out";
- char path[DIRECTION_MAX];
- int fd;
- snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction", pin);
- fd = open(path, O_WRONLY);
- if (fd < 0) {
- fprintf(stderr, "failed to open gpio direction for writing!\n");
- return -1;
- }
- if (write(fd, &dir_str[dir == IN ? 0 : 3], dir == IN ? 2 : 3) < 0) {
- fprintf(stderr, "failed to set direction!\n");
- return -1;
- }
- close(fd);
- return 0;
- }
【简单说明】
【1】dir_str[dir == IN ? 0 : 3], dir == IN ? 2 : 3 如果输入为常数宏IN, 取dir_str[0]=“in”;若输入常数宏为OUT,取dir_str[0]=“out”。此处巧妙的使用了在数组中的“\0”。
4 控制GPIO输出
- static int gpio_write(int pin, int value)
- {
- static const char values_str[] = "01";
- char path[DIRECTION_MAX];
- int fd;
- snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/value", pin);
- fd = open(path, O_WRONLY);
- if (fd < 0) {
- fprintf(stderr, "failed to open gpio value for writing!\n");
- return -1;
- }
- if (write(fd, &values_str[value == LOW ? 0 : 1], 1) < 0) {
- fprintf(stderr, "failed to write value!\n");
- return -1;
- }
- close(fd);
- return 0;
- }
5 获得GPIO输入
- static int gpio_read(int pin)
- {
- char path[DIRECTION_MAX];
- char value_str[3];
- int fd;
- snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/value", pin);
- fd = open(path, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "failed to open gpio value for reading!\n");
- return -1;
- }
- if (read(fd, value_str, 3) < 0) {
- fprintf(stderr, "failed to read value!\n");
- return -1;
- }
- close(fd);
- return (atoi(value_str));
- }
6 GPIO翻转操作
【main函数】
- int main(int argc, char *argv[])
- {
- int i = 0;
- gpio_export(P24);
- gpio_direction(P24, OUT); // GPIO为输出状态
- for (i = 0; i < 10; i++) {
- printf("LED Blink\n");
- gpio_write(P24, i % 2);
- usleep(500 * 1000);
- }
- gpio_write(P24, 0); // 恢复输出低电平
- gpio_unexport(P24);
- return 0;
- }
【makefile】——此处的代码tab显示可能存在问题,请以代码仓库为主。
- # 可执行文件
- TARGET=test
- # 源文件
- SRCS=gpio-sysfs.c
- # 目标文件
- OBJS=$(SRCS:.c=.o)
- # 指令编译器和选项
- CROSS=arm-fsl-linux-gnueabi-
- CC=$(CROSS)gcc
- STRIP=$(CROSS)strip
- CFLAGS=-Wall -std=gnu99 -O2
- $(TARGET):$(OBJS)
- $(CC) -o $@ $^
- $(STRIP) $@
- clean:
- rm -rf $(TARGET) $(OBJS)
- # 连续动作,先清除再编译链接,复制到tftpboot中
- install:clean $(TARGET)
- @echo 复制到tftpboot目录
- cp $(TARGET) ~/tftpboot
- @echo 复制结束
- # 编译规则 $@代表目标文件 $< 代表第一个依赖文件
- %.o:%.c
- $(CC) $(CFLAGS) -o $@ -c $<
阅读全文
0 0
- 文件IO方式操作GPIO
- 使用文件IO操作GPIO SysFs方式
- Linux操作GPIO(文件IO方式)
- linux IO方式操作gpio
- 树莓派使用文件IO操作GPIO SysFs方式
- Linux下用文件IO的方式操作GPIO
- linux中通用GPIO接口的操作--文件IO方式
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)简单易操作
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- /sys/class/gpio下用文件IO快捷操作GPIO
- EasyARM i.mx287学习笔记——文件IO方式操作GPIO
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
- php常用方法数组整理
- DirectX入门之初始化Direct3D及常见问题
- 51nod 1246 罐子和硬币(贪心)
- js和webview的交互
- 作业2:4-16进制译码器Verilog 语句实现
- 文件IO方式操作GPIO
- 两个字符串是否存在相同部分的比较
- tensorflow检查op是否可导(反向传播)
- 庆科信息AZ3166亮相北京2017微软技术暨生态大会
- opengl入门
- 【UVA1331】关于最优三角剖分
- 单据开发时,怎样让字段是添加时间的值是当前的时间?
- 基于Spring、SpringMVC、MyBatis、Druid、Shrio构建web系统
- python 最大公约数与最小公倍数