linux设备驱动归纳总结(八):4.总线热插拔

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

上一节介绍设备管理中的分层思想和面向对象思想(名字是我自己瞎编的)。接下来说一下热插拔的操作。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

一、热插拔的实现

我不知道在这里用热插拔这样的名字是否合适,在之前的代码,需要我自己手动去加载驱动和设备的模块,但在现实的情况下,一般是当设备一被插入,系统自己会注册设备,并调用合适的驱动。

所以,接下来我要实现的是,在加载了usb总线和usb鼠标驱动的前提下,当有usb鼠标插入,系统自己进行设备的操作。当然,上面的usb鼠标是我自己想象出来的,当我一按下按键(对应中断E_INT1),就代表有usb鼠标插入。

这样看来,要实现的代码就简单,稍稍修改一下程序就可以了,将之前由devie.ko实现的操作交由中断处理函数来执行,当我按下按键,触发中断自动执行。

driver.c不用修改,并且把device.c删掉,将代码移到bus.c中:

/*8th_devModule_4/1st/bus.c*/

9 struct work_struct my_work;

。。。。。

56 /**************

57 * 设备注册

58 *************/

59 void usb_dev_release(struct device *dev) //卸载函数没有干具体的事情

60 {

61     printk(" release\n");

62 }

63 /*结构体中不需要指定总线的成员,交由usb_device_register来完成*/

64 struct usb_device mouse_dev = {

65     .dev = {

66         .bus_id = "usb_mouse",

67         .release = usb_dev_release,

68     },

69 };

70

71 irqreturn_t hotplug_handler(int irqno, void *dev_id)

72 {

73     printk("usb mouse device insert\n");

74     schedule_work(&my_work); //调度到中断下半部执行

75     return IRQ_HANDLED;

76 }

77 void work_func(struct work_struct *work)//中断下半部处理函数

78 {

79     /*假设从硬件读取厂商编号和设备编号*/

80     mouse_dev.VendorID = 0x1122;

81     mouse_dev.DeviceID = 0x3344;

82     /*在中断函数中注册设备*/

83     usb_device_register(&mouse_dev);

84 }

85

86 static int __init usb_bus_init(void)

87 {

88     int ret;

89     /*初始化中断下文struct work_struct为工作队列类型*/

90     INIT_WORK(&my_work, work_func);

91     /*设置IRQ_EINT1的中断*/

92     ret = request_irq(IRQ_EINT1, hotplug_handler, IRQF_TRIGGER_FALLING, "usb
irq", NULL);

93     if(ret){

94         printk("irq failed\n");

95         return ret;

96     }

97

98       /*总线注册,必须检测返回值*/

99       ret = bus_register(&usb_bus);

100     if(ret){

101         printk("bus register failed!\n");

102         return ret;

103     }

104

105     printk("usb bus init\n");

106     return 0;

107 }

108

109 static void __exit usb_bus_exit(void)

110 {

111     bus_unregister(&usb_bus);

112     free_irq(IRQ_EINT1, NULL); //释放IRQ_EINT1的中断源

113     printk("usb bus bye!\n");

114 }

上面的代码可以看到,函数将原来在device.c中实现的操作放在了中断函数来执行,一旦usb鼠标被插入(这里是我假设的,其实就是按下按键,触发E_INT1中断),就会执行注册设备的操作。

看效果:

[root: 1st]# insmod bus.ko //先加载总线

usb bus init

[root: 1st]# insmod driver.ko //再加载驱动

usb driver init

[root: 1st]# usb mouse device insert //当我按下按键,触发中断,假设鼠标被插入

match success //配对成功

init usb mouse //初始化设备

当然,我的函数很多的bug,譬如你再次按下按键,那就会出现错误。但撇来这些不考虑,基本效果就出来了,当设备一插入,内核自动注册设备。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

二、总结

第八章的设备模型基本上就介绍完了,我在这里没有介绍kobject、kset等这一类内核中用于管理设备模型的结构体,有兴趣可以自己去看看。

接着就会介绍平台类总线设备,到时候你会发现,平台类总线设备其实就是总线的一个封装。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

源代码: 8th_devModule_4.rar

【Linux开发】linux设备驱动归纳总结(八):4.总线热插拔的更多相关文章

  1. linux设备驱动归纳总结

    前言: (总结已经基本写完,这段时间我会从新排版和修正.错误总会有的,望能指正!) 前段时间学习了嵌入式驱动,趁着没开始找工作,这段时间我会每天抽出时间来复习. 我的总结是根据学习时的笔记(李杨老师授 ...

  2. 【Linux】linux设备驱动归纳总结

    前言: (总结已经基本写完,这段时间我会从新排版和修正.错误总会有的,望能指正!) 前段时间学习了嵌入式驱动,趁着没开始找工作,这段时间我会每天抽出时间来复习. 我的总结是根据学习时的笔记(李杨老师授 ...

  3. 【Linux开发】linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想

    linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  4. 【Linux开发】linux设备驱动归纳总结(八):2.总线、设备和驱动的关系

    linux设备驱动归纳总结(八):2.总线.设备和驱动的关系 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  5. 【Linux开发】linux设备驱动归纳总结(八):1.总线、设备和驱动

    linux设备驱动归纳总结(八):1.总线.设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  6. linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-110738.html linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想 xxxxxx ...

  7. 【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存

    linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  8. 【Linux开发】linux设备驱动归纳总结(四):1.进程管理的相关概念

    linux设备驱动归纳总结(四):1.进程管理的相关概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  9. linux设备驱动归纳总结(八):4.总线热插拔【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-110774.html linux设备驱动归纳总结(八):4.总线热插拔 xxxxxxxxxxxxxxx ...

随机推荐

  1. Oracle之:Function :dateToNumber()

    create or replace function dateToNumber(i_date in date) return number is result number ; begin resul ...

  2. Acwing-285-没有上司的舞会(树型DP)

    链接: https://www.acwing.com/problem/content/287/ 题意: Ural大学有N名职员,编号为1~N. 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接 ...

  3. 题解 【NOIP2013】转圈游戏

    [NOIP2013]转圈游戏 Description n个小伙伴(编号从0到n-1)围坐一圈玩游戏.按照顺时针方向给n个位置编号,从0到n-1.最初,第0号小伙伴在第0号位置,第1号小伙伴在第1号位置 ...

  4. [Python之路] 日志操作

    使用logging模块来写日志 日志直接输出到准备输出 import logging logging.basicConfig(level=logging.WARNING, format="% ...

  5. React 的 DOM 添加多个点击事件

    第一直觉代码如下:后果是写在后面的事件函数覆盖前面的事件函数,只执行第二条(弹出 222). import React, { Component, Fragment } from 'react' ex ...

  6. 推荐系统系列(四):PNN理论与实践

    背景 上一篇文章介绍了FNN [2],在FM的基础上引入了DNN对特征进行高阶组合提高模型表现.但FNN并不是完美的,针对FNN的缺点上交与UCL于2016年联合提出一种新的改进模型PNN(Produ ...

  7. windows下我的工作环境

    目录 前言 需要的软件 环境 插件 快捷键 前言 为了更好地训练,所以机房把系统刷成了noi linux+win7 但是我理想的工作环境是 ubuntu16.04 及以上或 win10. 平时用noi ...

  8. Complete Tripartite

    D - Complete Tripartite 思路:这个题是个染色问题.理解题意就差不多写出来一半了.开始的时候还想用离散化来储存每个点的状态,即它连接的点有哪些,但很无奈,点太多了,long lo ...

  9. JavaWeb-SpringSecurity初认识

    Spring Security 安全 百度百科 功能:Spring Security对Web安全性的支持大量地依赖于Servlet过滤器.这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安 ...

  10. HDU 5894 hannnnah_j’s Biological Test ——(组合数)

    思路来自于:http://blog.csdn.net/lzedo/article/details/52585170. 不过并不需要卢卡斯定理,直接组合数就可以了. 代码如下: #include < ...