您的位置:首页 > 其它

通过sysfs在用户空间使用GPIO

2014-03-09 15:21 253 查看

通过sysfs在用户空间使用GPIO

2013-12-23 21:34:34| 分类:

Linux | 标签:gpio sysfs
|举报
|字号 订阅

通过使用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");
}

把GPIO 通过sysfs导出到 用户空间

看看新闻网看引擎开源产品

原 发表于4小时前(2013-11-19 18:15)

阅读(11) | 评论(0

0人收藏此文章,

赞0

在嵌入式设备中对GPIO的操作是最基本的操作。一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的。其实linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/gpio” 方式。

首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入 Device Drivers —> GPIO Support —> /sys/class/gpio/… (sysfs interface)。

/sys/class/gpio 的使用说明:

01 gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射

02 * 控制GPIO的目录位于/sys/class/gpio

03 * /sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号

04 * /sys/class/gpio/unexport 用于通知系统取消导出

05 * /sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号 base,寄存器名称,引脚总数 导出一个引脚的操作步骤

06 * 首先计算此引脚编号,引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数

07 * 向/sys/class/gpio/export写入此编号,比如12号引脚,在shell中可以通过以下命令实现,

echo 12 > /sys/class/gpio/export

命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出:

08

09 * direction文件,定义输入输入方向,可以通过下面命令定义为输出

10 echo out > /sys/class/gpio/gpio12/direction

11 * direction接受的参数:in, out, high, low。high/low同时设置方向为输出,

并将value设置为相应的1/0。

12 * value文件是端口的数值,为1或0.

13 echo 1 >/sys/class/gpio/gpio12/value

下面在2440下进行一下测试

1.取得GPIO信息,在终端中敲入以下命令

1 $ cd /sys/class/gpio

2 $ for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done

终端中显示如下

1 GPIOA: 0

2 GPIOE: 128

3 GPIOF: 160

4 GPIOG: 192

5 GPIOH: 224

6 GPIOB: 32

7 GPIOC: 64

8 GPIOD: 96

2.计算GPIO号码

我们把GPE11用来控制LED。

GPE0的头是128,GPE11 就是128+11 = 139.

1 $ echo 139 > /sys/class/gpio/export

ls 一下看看有没有 gpio139 这个目录

3.GPIO控制测试。

控制LED所以是输出。

所以我们应该执行

1 $ echo out > /sys/class/gpio/gpio139/direction

之后就可以进行输出设置了。

1 $ echo 1 > /sys/class/gpio/gpio139/value

声明:OSCHINA 博客文章版权属于作者,受法律保护。未经作者同意不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: