linux gpio export
2016-03-29 21:59
429 查看
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函数会总是返回。
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函数会总是返回。
相关文章推荐
- linux开机自启动
- linux字体配置问题之修改字族名称导致的覆盖问题
- 刘遄:读完《鸟哥的Linux私房菜》的感受。
- 2013337朱荟潼 Linux第三章读书笔记——进程管理
- insmod module.ko 出现Invalid parameters, dmesg显示信息:disagrees about version of symbol..
- linux下时间子系统
- linux基础命令练习1
- linux系统基础及简单安装步骤
- 【9】Linux-设备驱动概述
- Linux学习之路:变量值的删除、替代和替换
- Linux开发环境搭建 二 (Ubuntu串口工具minicom的安装及使用)
- 《Linux内核分析》第六周 读书笔记
- Centos下Yum安装PHP5.5,5.6,7.0
- 3.26课堂笔记——linux基础入门
- Linux下查看和添加PATH环境变量
- linux 内存管理分析之-----SLAB层
- 《Linux内核设计与实现》学习总结 Chap3
- Linux-HA开源软件Heartbeat(概念篇)
- 《Linux内核设计与实现》学习总结 Chap18
- centos启动时间查看