GPIO口及中断API函数【转】
本文转载自:http://blog.sina.com.cn/s/blog_a6559d9201015vx9.htmlG
#include <linux/gpio.h> // 标准 GPIO_API
int gpio_request(unsigned gpio, const char *label);
获得并占有 GPIO port 的使用权,由参数 gpio 指定具体 port,非空的lables指针有助于诊断。主要是告诉内核这地址被占用了。当其它地方调用同一地址的gpio_request就会报告错误,该地址已被申请。在/proc/mem应该会有地址占用表描述。
这种用法的保护作用前提是大家都遵守先申请再访问,有一个地方没遵守这个规则,这功能就失效了。好比进程互斥,必需大家在访问临界资源的时候都得先获取锁一样,其中一个没遵守约定,代码就废了。
例1:void gpio_free(unsigned gpio);//释放 GPIO port 的使用权,由gpio 指定具体port。
例2:gpio_free(RK29_PIN0_PA0);//释放GPIO0_A0
int gpio_direction_input(unsigned gpio);//返回0
例3:gpio_direction_input (RK29_PIN0_PA0);//把GPIO0_A0设置为输入
int gpio_direction_output(unsigned gpio, int value);//返回0
例4:gpio_direction_output(RK29_PIN0_PA0,GPIO_LOW);//把GPIO0_A0设置为输出口,且其电平拉低。 int gpio_get_value(unsigned gpio);//返回value
例5:ret = gpio_get_value (RK29_PIN0_PA0);// 读取GPIO0_A0的电平,并赋值给变量ret。
void gpio_set_value(unsigned gpio, int value);
例6:gpio_set_value (RK29_PIN0_PA0, GPIO_HIGH);// 设置RK29_PIN0_PA0电平为高。
int gpio_pull_updown(unsigned gpio,unsigned value);
value = 0, normal
value = 1, pull up
value = 2, pull down
例7:gpio_pull_updown(RK29_PIN0_PA0,1)上拉
int gpio_cansleep(unsigned gpio);
支持这种gpio的平台为了通过在这个函数中返回非零来区分其它类型的gpio(需要一个已经被 gpio_request申请的gpio号)为了访问这些端口,定义了另一组函数接口:
int gpio_get_value_cansleep(unsigned gpio);
void gpio_set_value_cansleep(unsigned gpio, int value);
只能在允许睡眠的上下文中访问这些端口,比如线程化的中断中,
static inline int gpio_is_valid(int number)//判断GPIO是否有效,有效返回0
int gpio_export(unsigned gpio, bool direction_may_change);//返回0成功
void gpio_unexport(); //返回0成功
int gpio_export_link(struct device *dev, const char *name, unsigned gpio)
//创建到导出GPIO的 sysfs link ,第一个参数是在哪个dev下创建,第二个是参数名字,第三个是gpio编号
中断部分的API:
static inline int gpio_to_irq(unsigned gpio)
例8:gpioToIrq = gpio_to_irq (RK29_PIN0_PA0);// 把GPIO0_A0的PIN值转换为相应的IRQ值,并赋值给变量gpioToIrq。
gpio_to_irq()返回的中断编号可以传给request_irq()和free_irq()。
irq_to_gpio()返回的gpio编号通常用来调用gpio_get_value(),比如在沿触发的中断中获取引脚的状态。有些平台不支持这种映射,应该避免调用映射函数
static inline int __must_check request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
范例:irq是要申请的硬件中断号; handler是向系统登记的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev参数将被传递; flags是中断处理的属性,若设置SA_INTERRUPT,标明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置SA_SHIRQ,则多个设备共享中断,*dev在中断共享时会用到,一般设置为这个设备的device结构本身或者NULL。 当flags发生时,触发中断。
例9:static irqreturn_t PA0IntHandler(int irq, void *dev_id)
{
printk(KERN_INFO "PA0IntHandler:irq=%d ",irq);
return IRQ_HANDLED;
}
void main(void)
{
// 把GPIO0_A0的PIN值转换为相应的IRQ值,并赋值给变量gpioToIrq。
unsigned long req_flags = IRQF_TRIGGER_RISING;
int gpioToIrq = gpio_to_irq (RK29_PIN0_PA0);
If(gpioToIrq != -1){
//注册PA0IntHandler中断处理函数,中断号是RK29_PIN0_PA0,设置为上升沿触发
request_irq(gpioToIrq, PA0IntHandler,req_flags, "PA0_test", NULL);
}
}
void free_irq(unsigned int irq, void *dev_id)//释放中断
irq: 释放的中断号 dev_id: 释放的dev_id
例10: free_irq(gpio_to_irq(RK29_PIN0_PA0),NULL);// 释放GPIO0_A0中断。
int set_irq_type(unsigned int irq, unsigned int type)
irq: 指定的中断号type : 设置的中断类型
例11:set_irq_type(gpio_to_irq(RK2818_PIN_PA0),IRQF_TRIGGER_LOW);//设置GPIO0_A0中断为低电平触发
void disable_irq_nosync(unsigned int irq)
强行关闭指定中断,不会等待当前中断处理程序执行完毕。,立即返回
例12:disable_irq_nosync(gpio_to_irq(RK29_PIN0_PA0));//关闭GPIO0_A0中断。
void disable_irq(unsigned int irq)
将关闭硬件中断并等待(可能有的)中断处理完成才返回。
例13:disable_irq (gpio_to_irq(RK29_PIN0_PA0));//关闭GPIO0_A0中断。
void enable_irq(unsigned int irq)
使能一个指定的中断
例14: enable_irq (gpio_to_irq(RK29_PIN0_PA0));//使能GPIO0_A0中断。
注意:使能IRQ和不使能IRQ应该配对使用。
若调用enable_irq之前,并未关闭指定中断(如调用disable_irq_nosync 关闭指定中断),
则调用enable_irq会报警告(WARNING: at kernel/irq/manage.c:274 enable_irq+0x48/0x68();Unbalanced enable for IRQ 58),此为正常现象。
int enable_irq_wake(unsigned int irq)//返回0成功
int disable_irq_wake(unsigned int irq)//返回0成功
要enable和disable的次数相同
例15:static inline int enable_irq_wake(unsigned int irq)
{return set_irq_wake(irq, 1);
}
static inline int disable_irq_wake(unsigned int irq)
{
return set_irq_wake(irq, 0);
}
void rk29_gpio_suspend(void)// 让GPIO进入省电睡眠模式
调用此函数,是否会让GPIO进入省电睡眠模式,与enable_irq_wake和disable_irq_wake函数相关,
例16:如果先调用了enable_irq_wake(gpio_to_irq(RK29_PIN0_PA0)),则即使调用了
void rk29_gpio_resume(void)//唤醒GPIO
GPIO口及中断API函数【转】的更多相关文章
- 探究为什么FreeRTOS 有些API不能在中断服务函数中调用,转而需要调用带ISR的版本
用了好久的FreeRTOS以前只是知道,如果在中断服务程序中调用某一些FreeRTOS的API函数时需要注意,如果有ISR版本的一定要调用末尾带ISR的函数,并且中断服务程序要调用freeRTOS的A ...
- STM32中断管理函数
CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ...
- mfc 调用Windows的API函数实现同步异步串口通信(源码)
在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...
- Linux kernel的中断子系统之(五):驱动申请中断API
返回目录:<ARM-Linux中断系统>. 总结:二重点区分了抢占式内核和非抢占式内核的区别:抢占式内核可以在内核空间进行抢占,通过对中断处理进行线程化可以提高Linux内核实时性. 三介 ...
- Delphi常用API,API函数
auxGetDevCaps API 获取附属设备容量 auxGetNumDevs API 返回附属设备数量 auxGetVolume API 获取当前卷设置 auxOutMessage API 向输出 ...
- FreeRTOS-05任务相关API函数
根据正点原子FreeRTOS视频整理 单片机:STM32F207VC FreeRTOS源码版本:v10.0.1 任务相关API函数: 1. main.c /* * */ #include " ...
- Linux kernel中断子系统之(五):驱动申请中断API【转】
转自:http://www.wowotech.net/linux_kenrel/request_threaded_irq.html 一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的 ...
- 【总结】设备树语法及常用API函数【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74352188 一.DTS编写语法 二.常用函数 设备树函数思路是:uboot ...
- 【STM32H7教程】第17章 STM32H7之GPIO的HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第17章 STM32H7之GPIO的HAL库API ...
随机推荐
- 微信支付(20140923更新)商户支付密钥key的生成与设置
微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 设置商户号支付密钥方法如下: 1. 申请通过审核后,打开微信发来 ...
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏
最近互联网招聘平台拉勾网在五一期间推出个“最难面试的IT公司”代码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspace.Cypress ...
- c# WinForm中使用DevExpress.XtraSpreadsheet.SpreadsheetControl时,给sheet批量赋值
即使看了Demo,我也是很久才搞清除的,可能是我太笨了 首先在form上添加一个spreadsheetcontrol控件,添加各种引用: 然后添加引用: using DevExpress.XtraEd ...
- Angular2 起步(1)
1.安装 nodejs(最新稳定版)https://nodejs.org/en/ 安装 typescript npm install -g typescript 安装 angular-cli(关于CL ...
- vim 设置行号
1.打开vim 输入 :echo $VIM 查看vim路径 一般是/use/share/vim 2.sudo vim vimrc 打开配置文件,G到文件末尾 3. 插入 :set number 保存推 ...
- WindowsService 安装 cmd
步骤: 1.运行--〉cmd:打开cmd命令框 2.在命令行里定位到InstallUtil.exe所在的位置 InstallUtil.exe 默认的安装位置是在C:/Windows/Microsoft ...
- oracle 参考
create or replace function fun_try(v_name varchar,v_outname out varchar)return varchar2 is Result va ...
- 【leetcode】两数之和
https://leetcode.com/problems/two-sum/ Example: Given nums = [2, 7, 11, 15], target = 9, Because num ...
- DevExpress XtraPivotGrid 交叉表 重复显示问题
转自:http://www.cnblogs.com/xiayan/archive/2011/11/04/2236389.html 最近发现xtrareport 的PivotGrid实现交叉表非常的简单 ...
- 如何理解C#委托
一:从下面的例子开始,理解委托变量本质 如上图,Condition是我定义的委托变量.这个委托变量的本质就是地址变量(即C语言当中的指针变量),它保存的是方法的入口地址. 当函数的调用者传递实参给这个 ...