工作队列(work queue)是Linux kernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。 这样,通过工作队列执行的代码能占尽进程上下文的所有优势。

工作队列:可使用内核提供的缺省的共享的默认队列,优点是简单易用,缺点是如果缺省工作队列的负载太多,则执行效率会很低。(工作者线程本质上是一个普通的内核线程,默认情况下,每个CPU均有一个类型为“events”的工作者线程)

也可创建使用自己的工作者线程和工作队列(使用create_workqueue创建)。(ps:使用新建工作线程和默认线程,调用的API部分不同)

Bcmtch15***.c 和ft5306.c触摸驱动均使用的是工作队列实现中断的底半部。

下面以敦泰触摸屏驱动ft5306.c为例,介绍其实现过程:

1、声明工作队列结构体指针:static struct workqueue_struct *synaptics_wq;

2、初始化工作队列:驱动init函数focaltech_ft5306_init中:

synaptics_wq = create_singlethread_workqueue("synaptics_wq");//因为使用的自己创建的工作队列,而非默认的内核的

//create_workqueue和create_singlethread_workqueue都是创建一个工作队列,但是差别在create_singlethread_workqueue可以指定为此工作队列只创建一个内核线程(前一个函数会为每一个处理器分别创建一个内核线程),这样可以节省资源,无需发挥SMP的并行处理优势。

if (!synaptics_wq) {

printk(KERN_ERR "Could not create work queue synaptics_wq: no memory");

return -ENOMEM;}

3、  ​初始化一个work,并绑定其处理函数:

INIT_WORK(&ts->work, focaltech_ft5306_work_func);

// focaltech_ft5306_work_func为处理函数,ts->work(ts为触摸屏结构体synaptics_rmi4)

//动态地初始化一个由work指向的工作,处理函数为func(无论是动态还是静态创建,默认定时器初始化为0,即不进行延时调度)

//focaltech_ft5306_work_func为使用container_of实现data指针的传递(container_of那就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针)。

struct synaptics_rmi4 *ts = container_of(work, struct synaptics_rmi4, work);

4、使用request_irq申请中断,绑定中断处理函数focaltech_ft5306_irq_handler

focaltech_ft5306_probe 函数中:

if (request_irq(GPIO_TO_IRQ(ts_gpio_irq_pin), focaltech_ft5306_irq_handler,

IRQF_TRIGGER_FALLING, client->name, ts) >= 0) {

printk("Requested IRQ\n");

ts->use_irq = 1;

printk(KERN_INFO "GPIO_%d INT: %d", ts_gpio_irq_pin,

GPIO_TO_IRQ(ts_gpio_irq_pin));

/*if ((ret = set_irq_wake(client->irq, 1)) < 0) {

printk(KERN_ERR "failed to set IRQ wake: %d\n", ret);

}*/

}

5、中断处理函数focaltech_ft5306_irq_handler中,使用queue_work(synaptics_wq, &ts->work);将工作添加到当前处理器对应的链表中

irqreturn_t focaltech_ft5306_irq_handler(int irq, void *dev_id)

{

struct synaptics_rmi4 *ts = dev_id;

queue_work(synaptics_wq, &ts->work);

return IRQ_HANDLED;

}

6、focaltech_ft5306_work_func函数中实现数据的上报等

使用 struct synaptics_rmi4 *ts = container_of(work,struct synaptics_rmi4, work);实现数据的传递

7.驱动exit函数focaltech_ft5306_exit中销毁工作队列:

static void __exit focaltech_ft5306_exit(void)

{

i2c_del_driver(&focaltech_ft5306_driver);

if (synaptics_wq)

destroy_workqueue(synaptics_wq);

}

linux 触摸屏驱动中断下半部实现-工作队列相关推荐

  1. Linux程序之触摸,linux 触摸屏驱动编写

    早在诺基亚手机还比较流行的时候,那时候触摸屏用的还不多.但是随着触摸屏手机.即智能手机的流行,触摸屏基本成了手机的标配.所以,今天可以看看触摸屏驱动在linux上是如何进行的. 1.驱动目录 driv ...

  2. 触摸屏linux系统时间,关于Linux触摸屏驱动

    操作系统对于经常应用电脑的用户非常的重要,一个好的操作系统,能更好的节省学习的时间.本文讲解Linux触摸屏驱动开发,在Linux触摸屏驱动中,最好的范例莫过于mc68328digi.c的实现.本文把 ...

  3. Linux触屏驱动Windows,linux 触摸屏驱动编写

    这篇文章主要介绍了linux 触摸屏驱动编写,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 早在诺基亚手机还比较流行的时候,那时候触摸屏用的还不多.但是随着触摸屏手机.即 ...

  4. linux 触摸结构体,xboot-x4412ibox项目实战54-Linux触摸屏驱动之I2C驱动实验 - Powered by Discuz!...

    前面我们分析了linux触摸屏驱动的input子系统机制,本章节分析linux触摸屏驱动的i2c机制. 驱动源码路径: kernel/drivers/input/touchscreen/ft5x06_ ...

  5. linux 触摸屏驱动编写

    早在诺基亚手机还比较流行的时候,那时候触摸屏用的还不多.但是随着触摸屏手机.即智能手机的流行,触摸屏基本成了手机的标配.所以,今天可以看看触摸屏驱动在linux上是如何进行的. 1.驱动目录 driv ...

  6. linux触摸屏代码解析,Linux触摸屏驱动解析

    Linux下开发触摸屏驱动,最好的范例莫过于mc68328digi.c的实现.在没有看到原文之前,我把其中用到的结构解析一下. 1,struct ts_pen_info 该结构是触摸屏的核心数据结构. ...

  7. linux 触摸屏驱动分析

    mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...

  8. linux 触摸屏驱动介绍

    本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次如下图所示, 其中事件处理层的函数都是通过input_register_handler()函数注册 ...

  9. linux 触摸屏驱动课程设计,linux驱动编写(触摸屏驱动)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 早在诺基亚手机还比较流行的时候,那时候触摸屏用的还不多.但是随着触摸屏手机.即智能手机的流行,触 ...

最新文章

  1. SSH服务审计工具ssh-audit
  2. 帝国cms微信小程序算命小程序开发之指纹算命实现方法
  3. Linux关机命令总结
  4. TLSNotary中心化预言机(2) 核心功能
  5. VMware VDI技术与实现
  6. 沃尔玛尝到了推行InnerSource的甜头
  7. Markdown列表
  8. 论文浅尝 | 变分知识图谱推理:在KG中引入变分推理框架
  9. .net framework 4.5安装失败
  10. Python学习笔记总结
  11. 自动驾驶算法-滤波器系列(七)——ESKF(error-state Kalman Filter)介绍
  12. 一段简单的python代码_一个简单的python写的C/S程序
  13. UE4之插件打包提示安装vs2017
  14. 单元测试实践的主要问题与解决(2)
  15. React学习笔记—JSX
  16. fanuc机器人仿真软件roboguide-新建工程文件
  17. Clark变换与Park
  18. h5 bootstrap 小程序模板_汉中餐饮行业支付宝小程序模板
  19. 【咕泡】Java高薪offer冲刺班【诚小七】
  20. 从零开始—仿牛客网讨论社区项目(六)

热门文章

  1. arduino tft 方向_怎样将TFT 1.44与Arduino Nano结合使用
  2. python天气预报的功能介绍_python 实现天气预报功能
  3. 微信开放品牌搜索、小米即将在香港上市
  4. 银行安全用电监管云平台
  5. 网页设计色彩搭配原则
  6. 西游之路——python全栈——报障系统之后台管理
  7. 第一章 使用 matplotlib 绘制折线图
  8. 《动手学深度学习》(PyTorch版)避坑总结 - 1 【d2lzh_pytorch模块导入方法详解及提示错误的解决方法】
  9. Jmeter导入文件/导出文件接口
  10. Jetson Xavier NX刷机安装Ubuntu20.04,配置CUDA,cuDNN,Pytorch等环境教程(英伟达官方源安装,理论适用其它Jetson设备)