嵌入式LINUX驱动开发(中断处理函数)
2020年08月11日
| 萬仟网网络运营
| 我要评论
嵌入式LINUX驱动学习之7中断相关(一)中断处理函数一、函数、头文件及说明二、编译举例:一、函数、头文件及说明//头文件位置:include/linux/interrupt.hextern int __must_checkrequest_threaded_irq(unsigned int irq, irq_handler_t handler,\ irq_handler_t thread_fn,\ unsigned
嵌入式LINUX驱动学习之7中断相关(一)中断处理函数
一、函数、头文件及说明
//头文件位置:include/linux/interrupt.h extern int __must_check request_threaded_irq(unsigned int irq, irq_handler_t handler,\
irq_handler_t thread_fn,\ unsigned long flags, const char *name, void *dev); static inline int __must_check \ request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) { return request_threaded_irq(irq, handler, NULL, flags, name, dev); } /*
参数:
irq : 中断号,获取外部中断号使用的函数 :
static inline int gpio_to_irq(unsigned gpio);//头文件位置:include/linux/gpio.h
irq_handler_t : 中断处理函数 :
typedef irqreturn_t (*irq_handler_t)(int, void *);
使用方法:
static irqretrun_t irq_func(int args,void * argv);//args:全局的整数,argv:全局指针
flags:
#define IRQF_TRIGGER_NONE 0x00000000 //没有中断
#define IRQF_TRIGGER_RISING 0x00000001 //上升沿触发
#define IRQF_TRIGGER_FALLING 0x00000002 //下降沿触发
#define IRQF_TRIGGER_HIGH 0x00000004 //高电平触发
#define IRQF_TRIGGER_LOW 0x00000008 //低电平触发
#define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
IRQF_TRIGGER_RISING |RQF_TRIGGER_FALLING)
#define IRQF_TRIGGER_PROBE 0x00000010
dev :向中断处理函数传递的参数
*/
二、编译举例:
#include #include #include #include #include /*定义按键信息*/ struct btn_srouce{ char *name; int gpio ; }; struct btn_srouce btn_info[] = { { .name = "BTN1", .gpio = PAD_GPIO_A +28 }, { .name = "BTN2", .gpio = PAD_GPIO_B +30 }, { .name = "BTN3", .gpio = PAD_GPIO_B +31 }, { .name = "BTN4", .gpio = PAD_GPIO_B +9 } }; /*定义LED灯信息*/ struct led_source { char *name; int gpio ; }; struct led_source led_info[] = { { .name = "LED1", .gpio = PAD_GPIO_B +26 }, { .name = "LED2", .gpio = PAD_GPIO_C +12 }, { .name = "LED3", .gpio = PAD_GPIO_C +11 }, { .name = "LED4", .gpio = PAD_GPIO_C +7 } }; static int irq;//定义中断号变更 /*定义中断处理函数*/ static irqreturn_t irq_func(int args,void * argv){ struct led_source *led_num = (struct led_source *) argv;//保存传递来的的形参地址 gpio_set_value(led_num->gpio,(1 - gpio_get_value(led_num->gpio)));//获取当前灯的状态信息,当为0时,设置为1,当为1时设置为0;即开/关状态切换 printk("%s ,当前%s状态为%s\n",__func__,led_num->name,\ gpio_get_value(led_num->gpio) ? "关" :"开"); return IRQ_HANDLED; //返回值说明,见附A.1 } static int btn_led_init(void){ int i = 0; for(; i
btn_info[i].name,&led_info[i]); } return 0; } static void btn_led_exit(void){ int i = 0; for(; i
附 A.1
//源码位置:include/linux/irqreturn.h /**
* enum irqreturn
* @IRQ_NONE interrupt was not from this device
* @IRQ_HANDLED interrupt was handled by this device
* @IRQ_WAKE_THREAD handler requests to wake the handler thread
*/ enum irqreturn { IRQ_NONE = (0 << 0), IRQ_HANDLED = (1 << 0), IRQ_WAKE_THREAD = (1 << 1), }; typedef enum irqreturn irqreturn_t;
本文地址:https://blog.csdn.net/weixin_47273317/article/details/107908456
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
相关文章:
for 实现:
复制代码 代码如下:
#!/bin/bash
set i=0
set j=0
for((i=0;i<...>
u-boot 与 启动模式u-boot(版本 U-Boot 1.1.6,u-boot.bin,4062204 b...
q:1 shell脚本是什么、它是必需的吗?
答:一个shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我...
如果对linux shell 数组不是很熟悉的话,请看上一篇文章:linux shell 数组建立及使用技巧 ,这篇文章...
简介netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (interface statistics),mas...
第一种:1、添加关键头文件:#include #include #incl...
一般我们在linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:
tmux: error while loadi...
1、基本概念
io多路复用是指内核一旦发现进程指定的一个或者多个io条件准备读取,它就通知该进程。io多路复用适用如下场合:
(...
vmware虚拟机下centos7 桥接方式网络配置完整步骤,供大家参考,具体内容如下
一、打开虚拟机的设置页面,设置虚拟机桥接模...
什么是 dns
dns 全称是 domain name system,大意是域名解析系统,它的职责是把域名翻译成一个一个可以识...
网友评论
验证码: