linux irq 接口,中断机制 – Linux内核API irq_set_chip_data
irq_set_chip_data函数功能描述:此函数是为irq_desc(结构体变量irq_desc的定义参见文件linux-3.19.3/include/linux/irqdesc.h)数组中对应下标为irq的元素设定字段chip_data的值,chip_data是一个void类型的指针,那么其类型就是不确定的了,一般此字段代表提供给字段chip中的函数的数据,供字段chip中函数共享,即提供一个共享数据区。
irq_set_chip_data文件包含
#include
irq_set_chip_data函数定义
在内核源码中的位置:linux-3.19.3/kernel/irq/chip.c
函数定义格式:
int irq_set_chip_data(unsigned int irq, void *data)
irq_set_chip_data输入参数说明
参数 irq 是设备对应的中断号,对应数组irq_desc中元素的下标,此数组的大小为16640。
参数data对应的是一个函数,其目的是为irq_desc数组中元素的chip字段中的函数提供一个私有的数据区,以实现chip字段中函数的共享执行。
irq_set_chip_data返回参数说明
此函数的返回结果是int型的变量,可能的取值是0、-22,如果返回0说明设置字段chip_data成功,如果返回-22说明设置字段chip_data失败,可能的原因有两个:
参数irq超过数组irq_desc的范围,数组越界;
与参数irq对应的irq_desc数组中的元素的chip字段为NULL。
irq_set_chip_data实例解析
编写测试文件:irq_set_chip_data.c头文件引用及全局变量定义:
#include
#include
#include
MODULE_LICENSE("GPL");
static int irq=10; //中断号定义,可将irq更改为1000进行错误验证
中断处理函数及中断线程处理函数定义:
// 自定义中断处理函数
static irqreturn_t irq_handler(int irq, void *dev_id)
{
printk("the irq is :%d\n", irq); //显示中断号
printk("in the interrupt handler function\n");
return IRQ_WAKE_THREAD;
}
// 自定义中断线程处理函数
static irqreturn_t irq_thread_fn(int irq, void *dev_id)
{
printk("the irq is :%d\n", irq); //显示中断号
printk("in the thread handler function\n");
return IRQ_HANDLED;
}
自定义数据结构,用于函数irq_set_chip_data的第二个参数:
// 自定义数据结构,用于函数irq_set_chip_data的第二个参数,作者随意定义,无实际意义
struct chip_data
{
int num;
char * name;
int flags;
};
模块加载函数定义:
static int __init irq_set_chip_data_init(void)
{
int result=0;
int result1=0;
int result2=0;
struct chip_data data; //自定义结构体变量,在此只是充当参数,没有实际应用的意义
printk("into irq_set_chip_data_init\n");
/*申请中断*/
result=request_threaded_irq(irq, irq_handler, irq_thread_fn, IRQF_DISABLED, "A_NEW_DEVICE", NULL); result1=irq_set_chip(irq, NULL); //调用函数irq_set_chip( )给chip赋值
result2=irq_set_chip_data(irq, &data); //调用函数irq_set_chip_data( )给chip_data赋值
printk("the request_threaded_irq result is: %d\n", result);
//显示函数request_threaded_irq( )返回结果
printk("the irq_set_chip result is: %d\n", result1);
//显示函数irq_set_chip( )返回结果
printk("the irq_set_chip_data result is: %d\n", result2);
//显示函数irq_set_chip_data( )返回结果
printk("out irq_set_chip_data_init\n");
return 0;
}
模块退出函数定义:
static void __exit irq_set_chip_data_exit(void)
{
free_irq(irq, NULL); //释放申请的中断
printk("Goodbye irq_set_chip_data\n");
return;
}
模块加载、退出函数调用:
module_init(irq_set_chip_data_init);
module_exit(irq_set_chip_data_exit);
实例运行结果及分析:
编译模块,输入命令insmod irq_set_chip_data.ko加载模块,然后输入命令dmesg -c查看内核输出信息,出现如图A所示的结果。
如果将传入的第一个参数irq设置为1000,出现如图B所示的运行结果。
结果分析:
由图A可以看出函数irq_set_chip_data( )的返回结果是0,说明函数设置chip_data字段成功;对于图B的输出信息,可以看出函数irq_set_chip_data( )返回结果是-22,说明函数设置字段chip_data失败,因为传入的第一个参数irq的值为1000,此值超过了数组irq_desc的范围,数组越界,对应的中断描述符不存在。
linux irq 接口,中断机制 – Linux内核API irq_set_chip_data相关推荐
- Linux系统接口ioc,Linux下SCSI API研究及应用
Linux下SCSI API研究及应用 Linux SCSI体系结构及API数据结构的操作原理和相关的系统调用,运用SCSI API实现了有关的数据存储. 关键词: SCSI通用驱动器 SCSI接口 ...
- linux pcm接口调试,Linux的alsa接口播放pcm音频数据
ALSA框架,是Linux的音频接口,包括alsa驱动程序和用户API(asound库). alsa驱动程序,是Linux内核给声卡驱动程序提供的标准. 用户API,是Linux给需要声音的播放和采集 ...
- linux skype 接口,ubuntu /linux下skype api开发环境搭建
1.安装Skype: 下载skype for linux,地址:http://www.skype.com/download/skype/linux/choose/ 可以下载一个ubuntu 8.10 ...
- linux测试接口配置,linux can 总线socket接口测试使用
最近调试一个sja1000的can驱动,发现到了2.6.36,linux把can总线封装成了网络接口.内核文档里给出了这么修改的原因. 1. Overview / What is Socket CAN ...
- linux程序接口实验,Linux程序接口实验:取进程标志及用户信息
0.环境平台 操作系统平台: Linux leaf 4.4.0-75-generic #96-Ubuntu SMP Thu Apr 20 09:56:33 UTC 2017 x86_64 x86_64 ...
- linux配置接口多地址,Linux /etc/network/interfaces配置接口方法
Linux下/etc/network/interfaces文件用来配置网络接口. 初始化网口Ethernet Interface 大部分的网络接口配置都可以在/etc/network/interfac ...
- platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架
platform框架 input. pinctrl. gpio 子系统都是 Linux 内核针对某一类设备而创建的框架, input子系统是管理输入的子系统 pinctrl 子系统重点是设置 PIN( ...
- linux IRQ Management(六)- DTS及调试
了解DTS Interrupt 设置方式. 1.DTS 中 interrupt 描述 interrupt-controller - 一个空的属性定义, 该节点作为一个接收中断信号的设备. #inter ...
- 【Linux 内核 内存管理】内存管理架构 ① ( 内存管理架构组成 | 用户空间 | 内核空间 | MMU 硬件 | Linux 内核架构层次 | Linux 系统调用接口 )
文章目录 一.内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二.Linux 内核架构层次 三.Linux 系统调用接口 一.内存管理架构组成 ( 用户空间 | 内核空间 | MM ...
最新文章
- CreateStructuringElementEx
- 重磅!Elasticsearch 8 正式发布!
- 「镁客·请讲」全盛科技吕盛:将侦测、跟踪、识别、管控融于一体,做低空安全守卫者...
- 剪切粘贴时总是上次的内容_【Procreate 迷你课堂】#4 三指快速拷贝及粘贴
- 一个软件项目的总纲性的测试计划叫什么?
- ITK:将网格写入vtp文件
- 7/7 SELECT语句:创建计算字段
- 在Linux和Mac OS X系统上运行.NET
- bigdicmal除法精度设置_BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题
- chart控件做实时曲线显示_基于GDI+技术开发工业仪表盘控件
- python 为抓取而生
- Shell 常用积累
- iOS中Storyboard使用要点记录
- 仿百度的输入提示功能
- 5个免费全球DEM数据源-数字高程模型
- ABBYY FineReader 15 PDF文档查看功能
- 用gitee搭建自己的博客网站
- Python实用案例,Python脚本,Python实现每日更换“必应图片”为“桌面壁纸”
- 2022秋招笔试备考合集——银行篇(下)|智测优聘出品
- linux中help的用法