开发环境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_BASE0#define SUNXI_PB_BASE32#define SUNXI_PC_BASE64#define SUNXI_PD_BASE96#define SUNXI_PE_BASE128#define SUNXI_PF_BASE160#define SUNXI_PG_BASE192#define SUNXI_PH_BASE224#define SUNXI_PI_BASE256#define SUNXI_PJ_BASE288#define SUNXI_PK_BASE320#define SUNXI_PL_BASE352#define SUNXI_PM_BASE384#define SUNXI_PN_BASE416
规律: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_PH7231
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;}