一、Linux驱动程序
驱动程序为drivers\gpio\gpiolib-sysfs.c
二、通过SYSFS使用GPIO
如果只是简单的引脚控制(比如输出、查询输入值),可以不编写驱动程序,这样可以节省很多事情。
但是涉及中断的话,就需要编写驱动程序了。
2.1 设置GPIO方向,读写值
1、可通过串口输出命令验证
1、设置你想操作的GPIO Pin,这里我们假设用GPIO76
cd /sys/class/gpio/
echo 76 > export
2、设置GPIO Pin的方向:
echo "in" > gpio76 //for input direction
echo "out" > gpio76 //for outputdirection
3、设置输出GPIO Pin的值
echo 1 > gpio76/value //for output high level
echo 0 > gpio76/value //for output low level
4、读取GPIO Pin的值
cat gpio76/value //1:higl level, 0:low level
2、通过应用程序操作
(1)读取指定GPIO Pin的值
int getGPIOValue(int gpio)
{
int fd = -1,value;
char filename[256] = {0};
char buf[32] = {0};
if (access("/sys/class/gpio/export",F_OK))
{
ALOGD("/sys/class/gpio/export is no exist");
return -1;
}
if (access("/sys/class/gpio/unexport",F_OK))
{
ALOGD("/sys/class/gpio/unexport is no exist");
return -1;
}
fd = open("/sys/class/gpio/export",O_WRONLY);
if (fd < 0)
{
ALOGD("open /sys/class/gpio/export fail");
return -1;
}
sprintf(buf,"%d",gpio);
write(fd,buf,strlen(buf));
close(fd);
sprintf(filename,"/sys/class/gpio/gpio%d/value",gpio);
fd = open(filename,O_RDONLY);
if (fd < 0)
{
ALOGD("open %s fail",filename);
return -1;
}
memset(buf,0,sizeof(buf));
read(fd,buf,sizeof(buf));
close(fd);
value = atoi(buf);
fd = open("/sys/class/gpio/unexport",O_WRONLY);
if (fd < 0)
{
ALOGD("open /sys/class/gpio/unexport fail");
return -1;
}
memset(buf,0,sizeof(buf));
sprintf(buf,"%d",gpio);
write(fd,buf,strlen(buf));
close(fd);
return value;
}
(2)设置指定GPIO Pin的方向和值
int setGPIOValue(int gpio,char *direction,int value)
{
char filename[256] = {0};
char buf[8] = {0};
int fd = -1;
if (access("/sys/class/gpio/export",F_OK))
{
ALOGD("/sys/class/gpio/export is no exist");
return -1;
}
if (access("/sys/class/gpio/unexport",F_OK))
{
ALOGD("/sys/class/gpio/unexport is no exist");
return -1;
}
fd = open("/sys/class/gpio/export",O_WRONLY);
if (fd < 0)
{
ALOGD("open /sys/class/gpio/export fail");
return -1;
}
sprintf(buf,"%d",gpio);
write(fd,buf,strlen(buf));
close(fd);
memset(filename,0,sizeof(filename));
memset(buf,0,sizeof(buf));
sprintf(filename,"/sys/class/gpio/gpio%d/direction",gpio);
fd = open(filename,O_WRONLY);
if (fd < 0)
{
ALOGD("open %s fail",filename);
return -1;
}
memset(buf,0,sizeof(buf));
sprintf(buf,"%s",direction);
write(fd,buf,sizeof(buf));
close(fd);
memset(filename,0,sizeof(filename));
memset(buf,0,sizeof(buf));
sprintf(filename,"/sys/class/gpio/gpio%d/value",gpio);
if(access(filename, F_OK))
{
ALOGD("%s is no exist!\n", filename);
return -1;
}
memset(buf,0,sizeof(buf));
sprintf(buf, "%d", value);
fd = open(filename,O_WRONLY);
if (fd < 0)
{
ACTUILOG("open %s fail", filename);
return -1;
}
write(fd,buf,sizeof(buf));
close(fd);
fd = -1;
return 0;
}
比如setGPIOValue(76,"out",1); //将GPIO76 设置为输出,并且输出高电平