用户名: 密码: 忘记密码? 注册

linux下的GPIO试验

作者:  时间: 2010-10-20
一、试验概述
(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;
   }