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相关推荐

  1. Linux系统接口ioc,Linux下SCSI API研究及应用

    Linux下SCSI API研究及应用 Linux SCSI体系结构及API数据结构的操作原理和相关的系统调用,运用SCSI API实现了有关的数据存储. 关键词: SCSI通用驱动器  SCSI接口 ...

  2. linux pcm接口调试,Linux的alsa接口播放pcm音频数据

    ALSA框架,是Linux的音频接口,包括alsa驱动程序和用户API(asound库). alsa驱动程序,是Linux内核给声卡驱动程序提供的标准. 用户API,是Linux给需要声音的播放和采集 ...

  3. linux skype 接口,ubuntu /linux下skype api开发环境搭建

    1.安装Skype: 下载skype for linux,地址:http://www.skype.com/download/skype/linux/choose/ 可以下载一个ubuntu 8.10 ...

  4. linux测试接口配置,linux can 总线socket接口测试使用

    最近调试一个sja1000的can驱动,发现到了2.6.36,linux把can总线封装成了网络接口.内核文档里给出了这么修改的原因. 1. Overview / What is Socket CAN ...

  5. 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 ...

  6. linux配置接口多地址,Linux /etc/network/interfaces配置接口方法

    Linux下/etc/network/interfaces文件用来配置网络接口. 初始化网口Ethernet Interface 大部分的网络接口配置都可以在/etc/network/interfac ...

  7. platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架

    platform框架 input. pinctrl. gpio 子系统都是 Linux 内核针对某一类设备而创建的框架, input子系统是管理输入的子系统 pinctrl 子系统重点是设置 PIN( ...

  8. linux IRQ Management(六)- DTS及调试

    了解DTS Interrupt 设置方式. 1.DTS 中 interrupt 描述 interrupt-controller - 一个空的属性定义, 该节点作为一个接收中断信号的设备. #inter ...

  9. 【Linux 内核 内存管理】内存管理架构 ① ( 内存管理架构组成 | 用户空间 | 内核空间 | MMU 硬件 | Linux 内核架构层次 | Linux 系统调用接口 )

    文章目录 一.内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二.Linux 内核架构层次 三.Linux 系统调用接口 一.内存管理架构组成 ( 用户空间 | 内核空间 | MM ...

最新文章

  1. CreateStructuringElementEx
  2. 重磅!Elasticsearch 8 正式发布!
  3. 「镁客·请讲」全盛科技吕盛:将侦测、跟踪、识别、管控融于一体,做低空安全守卫者...
  4. 剪切粘贴时总是上次的内容_【Procreate 迷你课堂】#4 三指快速拷贝及粘贴
  5. 一个软件项目的总纲性的测试计划叫什么?
  6. ITK:将网格写入vtp文件
  7. 7/7 SELECT语句:创建计算字段
  8. 在Linux和Mac OS X系统上运行.NET
  9. bigdicmal除法精度设置_BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题
  10. chart控件做实时曲线显示_基于GDI+技术开发工业仪表盘控件
  11. python 为抓取而生
  12. Shell 常用积累
  13. iOS中Storyboard使用要点记录
  14. 仿百度的输入提示功能
  15. 5个免费全球DEM数据源-数字高程模型
  16. ABBYY FineReader 15 PDF文档查看功能
  17. 用gitee搭建自己的博客网站
  18. Python实用案例,Python脚本,Python实现每日更换“必应图片”为“桌面壁纸”
  19. 2022秋招笔试备考合集——银行篇(下)|智测优聘出品
  20. linux中help的用法

热门文章

  1. ERP软件触发器判断单身数据为什么状态,如何执行
  2. IBM p系列小型机日常维护及故障排除时常用命令(检查IBM设备状态汇总)
  3. 有关HTTP2.0详解
  4. html discription 属性,@description
  5. 吃算法的 计算机方向,算法工程师算是吃青春饭的吗
  6. 语法分析器(syntax analyzer)【Perl实现】
  7. 用Haskell写的卡普雷尔卡kaprekar黑洞小程序
  8. 用累积分布函数(CDF)计算期望
  9. Linux 下利用dnw进行USB下载~~
  10. GPU-CUDA-图形渲染分析