linux下的GPIO试验
时间:2010-10-20 来源:osullishuai80
一、试验概述
(1)试验目的:掌握通过文件系统操作GPIO设备的方法.
(2)在linux中,所有设备都是以文件的形式被打开并进行读/写操作的,本试验中使用POSIX兼容的文件操作接口函数对底层设备进行操作.其中,POSIX是Portable Operating System Interface for UNIX的首字母缩写,是一套IEEE和ISO标准. 二、GPIO常用API函数
(1)打开某(设备)文件的操作函数
#include <unistd.h>
#include <fcntl.h>
int open(const char *path,int oflag)
函数功能:打开path所指的文件或(设备)文件,成功打开后返回文件描述符.
参数1:文件路径或设备名.linux下的设备文件常存放在/dev目录下.
参数2:打开方式.
O_RDONLY:只读方式打开
O_RDONLY:只写方式打开
O_RDWR:读写方式打开,等同于O_RDONLY|O_RDONLY
O_CREAT:如果文件不存在,则首先创建.
O_EXCL:独占方式打开
O_NONBLOCK:采用非阻塞文件IO方式
(2)关闭某个(设备)文件
int close(int fd)
函数功能:关闭被打开的文件.
参数:该参数是文件或(设备)文件.
返回值:成功打开后返回0,失败返回-1.
(3)读某个(设备)文件
ssize_t read(int fd,void *buffer,size_t count)
函数功能:从已打开的文件中读取数据
参数1:(设备)文件或设备句柄,通常由open()函数返回.
参数2:数据缓冲区.将读到的数据存放在该缓存内.
参数3:要读取的字节数.
返回值:成功读取返回读取的字节数,失败返回-1.
(4)写某个(设备)文件
ssize_t write(int fd,void *buffer,size_t count)
函数功能:向已打开的(设备)文件中写入数据
参数1:(设备)文件或设备句柄,通常由open()函数返回.
参数2:数据缓冲区.将缓存内的数据写入某个(设备)文件中.
返回值:成功写入后返回写入的字节数,失败返回-1.
(5)设置I/O设备的属性
#include <sys/ioctl.h>
int ioctl(inf fd,unsigned long int cmd,...)
函数功能:设置I/O设备的属性
参数1:文件路径或设备名.linux下的设备文件常存放在/dev目录下.
参数2:驱动程序控制命令
返回值:成功返回0,失败返回错误码.
Attention!!!
以s3c2440的GPF设置为例:
控制命令0 参数 意义
GPIO_SET_PIN n 设置第n个引脚输出高电平
GPIO_SET_ALL_PIN 无 设置所有引脚输出高电平
GPIO_CLR_PIN n 设置第n个引脚输出低电平
GPIO_CLR_ALL_PIN 无 设置所有引脚输出低电平
GPIO_SET_PIN_OUT n 设置第n个引脚为输出
GPIO_SET_PIN_IN n 设置第n个引脚为输入
GPIO_SET_MULTI_PIN_OUT n 将n中为1的位对应的引脚设置为输出
GPIO_SET_MULTI_PIN_IN n 将n中为1的位对应的引脚设置为输入
如:ioctl(fd_gpf,GPIO_SET_MULTI_PIN_OUT,0xf0)
将GPF的GPF4、GPF5、GPF6、GPF7为输出引脚.
三、linux下的GPIO试验
试验说明:按下某一键时,相应的LED点亮.
#include "gpio.h"
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h> int main(void)
{
int fd1,fd2;
int ret1,ret2;
int value1=0x0;
int value2=0x7;
fd1 = open("/dev/gpgdriver",O_RDWR); //打开GPIO对应的设备文件
fd2 = open("/dev/key13",O_RDWR); //打开键盘对应的设备文件
if(fd1<0)
perror("error");
ret1 = ioctl(fd1,GPIO_SET_MULTI_PIN_OUT,0x07); //将LED对应引脚配置为输出
if(ret1<0)
perror("error");
ret2 = ioctl(fd2,GPIO_SET_MULTI_PIN_IN,0x1c); //将键盘对应引脚配置为输入
if(ret2<0)
perror("error");
while(1)
{
read(fd2,&value1,1);
value1 &= 0x1c; //保证只有3个键盘有输入
switch(value1)
{
case 0x18:
write(fd1,&(value2&0x01),1);
break;
case 0x04:
write(fd1,&(value2&0x02),1);
break;
case 0x0c:
write(fd1,&(value2&0x04),1);
break;
default:
break;
}
}
return 0;
}
(1)试验目的:掌握通过文件系统操作GPIO设备的方法.
(2)在linux中,所有设备都是以文件的形式被打开并进行读/写操作的,本试验中使用POSIX兼容的文件操作接口函数对底层设备进行操作.其中,POSIX是Portable Operating System Interface for UNIX的首字母缩写,是一套IEEE和ISO标准. 二、GPIO常用API函数
(1)打开某(设备)文件的操作函数
#include <unistd.h>
#include <fcntl.h>
int open(const char *path,int oflag)
函数功能:打开path所指的文件或(设备)文件,成功打开后返回文件描述符.
参数1:文件路径或设备名.linux下的设备文件常存放在/dev目录下.
参数2:打开方式.
O_RDONLY:只读方式打开
O_RDONLY:只写方式打开
O_RDWR:读写方式打开,等同于O_RDONLY|O_RDONLY
O_CREAT:如果文件不存在,则首先创建.
O_EXCL:独占方式打开
O_NONBLOCK:采用非阻塞文件IO方式
(2)关闭某个(设备)文件
int close(int fd)
函数功能:关闭被打开的文件.
参数:该参数是文件或(设备)文件.
返回值:成功打开后返回0,失败返回-1.
(3)读某个(设备)文件
ssize_t read(int fd,void *buffer,size_t count)
函数功能:从已打开的文件中读取数据
参数1:(设备)文件或设备句柄,通常由open()函数返回.
参数2:数据缓冲区.将读到的数据存放在该缓存内.
参数3:要读取的字节数.
返回值:成功读取返回读取的字节数,失败返回-1.
(4)写某个(设备)文件
ssize_t write(int fd,void *buffer,size_t count)
函数功能:向已打开的(设备)文件中写入数据
参数1:(设备)文件或设备句柄,通常由open()函数返回.
参数2:数据缓冲区.将缓存内的数据写入某个(设备)文件中.
返回值:成功写入后返回写入的字节数,失败返回-1.
(5)设置I/O设备的属性
#include <sys/ioctl.h>
int ioctl(inf fd,unsigned long int cmd,...)
函数功能:设置I/O设备的属性
参数1:文件路径或设备名.linux下的设备文件常存放在/dev目录下.
参数2:驱动程序控制命令
返回值:成功返回0,失败返回错误码.
Attention!!!
以s3c2440的GPF设置为例:
控制命令0 参数 意义
GPIO_SET_PIN n 设置第n个引脚输出高电平
GPIO_SET_ALL_PIN 无 设置所有引脚输出高电平
GPIO_CLR_PIN n 设置第n个引脚输出低电平
GPIO_CLR_ALL_PIN 无 设置所有引脚输出低电平
GPIO_SET_PIN_OUT n 设置第n个引脚为输出
GPIO_SET_PIN_IN n 设置第n个引脚为输入
GPIO_SET_MULTI_PIN_OUT n 将n中为1的位对应的引脚设置为输出
GPIO_SET_MULTI_PIN_IN n 将n中为1的位对应的引脚设置为输入
如:ioctl(fd_gpf,GPIO_SET_MULTI_PIN_OUT,0xf0)
将GPF的GPF4、GPF5、GPF6、GPF7为输出引脚.
三、linux下的GPIO试验
试验说明:按下某一键时,相应的LED点亮.
#include "gpio.h"
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h> int main(void)
{
int fd1,fd2;
int ret1,ret2;
int value1=0x0;
int value2=0x7;
fd1 = open("/dev/gpgdriver",O_RDWR); //打开GPIO对应的设备文件
fd2 = open("/dev/key13",O_RDWR); //打开键盘对应的设备文件
if(fd1<0)
perror("error");
ret1 = ioctl(fd1,GPIO_SET_MULTI_PIN_OUT,0x07); //将LED对应引脚配置为输出
if(ret1<0)
perror("error");
ret2 = ioctl(fd2,GPIO_SET_MULTI_PIN_IN,0x1c); //将键盘对应引脚配置为输入
if(ret2<0)
perror("error");
while(1)
{
read(fd2,&value1,1);
value1 &= 0x1c; //保证只有3个键盘有输入
switch(value1)
{
case 0x18:
write(fd1,&(value2&0x01),1);
break;
case 0x04:
write(fd1,&(value2&0x02),1);
break;
case 0x0c:
write(fd1,&(value2&0x04),1);
break;
default:
break;
}
}
return 0;
}
相关阅读 更多 +