linux gpio export

    linux提供了一系列的函数来操作GPIO,看下面的代码:

  int io_out, in_in;   //定义一个输出IO和一个输入IO

  io_out = GPIO_TO_PIN(1, 16);
  io_in = GPIO_TO_PIN(1, 17);

  gpio_request(io_out, "gpio_out");   //申请IO
  gpio_request(io_in, "gpio_in");

  gpio_direction_output(io_out, 1);   //设置IO为输出,上拉
  gpio_direction_input(io_in);      //设置IO为输入

  gpio_set_value(io_out, 0);       //设置IO的输出为低
  gpio_get_value(io_in);		//读取IO的值

  gpio_export(io_out, 1);		//导出IO到用户空间
  gpio_export(io_in, 0);
    
gpio_export函数的第二个参数表示用户是否可以改变IO的输入输出方向。

使用gpio_export导出到用户空间后,在/sys/class/gpio/gpio16 和/sys/class/gpio/gpio17提供了访问他们的操作。

例如echo 1 > /sys/class/gpio/gpio16/value即是写入1。

在用户层也可以导出IO,使用echo 18 > /sys/class/gpio/export即导出IO18到用户空间,再使用 echo in > /sys/class/gpio/gpio18即设置gpio18为输入io,设置输出io调用“echo out。/sys/class/gpio/unexport的操作与export相反,即取消导出的IO。


gpio的源码在drivers/gpio/Gpiolib.c中,与芯片有关的结构是struct gpio_chip。


用户层也可以将IO配置为中断,即设置/sys/class/gpio/gpioN/edge:

           none表示引脚为输入,不是中断引脚

           rising表示引脚为中断输入,上升沿触发

           falling表示引脚为中断输入,下降沿触发

           both表示引脚为中断输入,边沿触发

 首先需要将该gpio配置为中断

echo  "rising" > /sys/class/gpio/gpio12/edge       

以下是伪代码

int gpio_id;

struct pollfd fds[1];

gpio_fd = open("/sys/class/gpio/gpio12/value",O_RDONLY);

if( gpio_fd == -1 )

   err_print("gpio open");

fds[0].fd = gpio_fd;

fds[0].events  = POLLPRI;

ret = read(gpio_fd,buff,10);

if( ret == -1 )

    err_print("read");

while(1){

     ret = poll(fds,1,-1);

     if( ret == -1 )

         err_print("poll");

       if( fds[0].revents & POLLPRI){

           ret = lseek(gpio_fd,0,SEEK_SET);

           if( ret == -1 )

               err_print("lseek");

           ret = read(gpio_fd,buff,10);

           if( ret == -1 )

               err_print("read");

            /*此时表示已经监听到中断触发了,该干事了*/

            ...............

    }

}

记住使用poll()函数,设置事件监听类型为POLLPRI和POLLERR在poll()返回后,使用lseek()移动到文件开头读取新的值或者关闭它再重新打开读取新值。必须这样做否则poll函数会总是返回。



 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值