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

2019-07-13 07:02发布


开发环境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 #include #include #include
#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. "); for(i=0; i<50; i++) { printf("gpio_ph7 value is 1. "); p = fopen("/sys/class/gpio/gpio231/value","w"); fprintf(p,"%d",1); sleep(1); fclose(p);
printf("gpio_ph7 value is 0. "); 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;}