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


开发环境
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;
}

猜你喜欢

转载自blog.csdn.net/u012247418/article/details/80027385
今日推荐