linux设备驱动归纳总结(八):4.总线热插拔【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-110774.html
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
linux设备驱动归纳总结(八):4.总线热插拔【转】的更多相关文章
- linux设备驱动归纳总结
前言: (总结已经基本写完,这段时间我会从新排版和修正.错误总会有的,望能指正!) 前段时间学习了嵌入式驱动,趁着没开始找工作,这段时间我会每天抽出时间来复习. 我的总结是根据学习时的笔记(李杨老师授 ...
- 【Linux】linux设备驱动归纳总结
前言: (总结已经基本写完,这段时间我会从新排版和修正.错误总会有的,望能指正!) 前段时间学习了嵌入式驱动,趁着没开始找工作,这段时间我会每天抽出时间来复习. 我的总结是根据学习时的笔记(李杨老师授 ...
- linux设备驱动归纳总结(八):2.总线、设备和驱动的关系【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-110295.html linux设备驱动归纳总结(八):2.总线.设备和驱动的关系 xxxxxxxxx ...
- linux设备驱动归纳总结(八):1.总线、设备和驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-109733.html linux设备驱动归纳总结(八):1.总线.设备和驱动 xxxxxxxxxxxx ...
- 【Linux开发】linux设备驱动归纳总结(八):2.总线、设备和驱动的关系
linux设备驱动归纳总结(八):2.总线.设备和驱动的关系 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- 【Linux开发】linux设备驱动归纳总结(八):4.总线热插拔
linux设备驱动归纳总结(八):4.总线热插拔 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- 【Linux开发】linux设备驱动归纳总结(八):1.总线、设备和驱动
linux设备驱动归纳总结(八):1.总线.设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- linux设备驱动归纳总结(九):1.platform总线的设备和驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-111745.html linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxx ...
- linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-110738.html linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想 xxxxxx ...
随机推荐
- spring MVC的困惑--url-pattern的/和/*有区别
总是现象就是:spring用到forward("/WEB-INF/jsp/*.jsp")而forward当然是又要经过web.xml的映射的,然后,在URL匹配时,<url- ...
- iOS WIFI
一.公共WIFI综述 现在很多公司都在做免费WIFI,车站.公交.地铁.餐厅,只要是人员密集流动的地方就有WIFI,免费WIFI从最初的网页认证方式也逐渐向客户端认证方式偏移.本文主要讨论iOS认证上 ...
- ThreadLocal 多线程并发,数据隔离
ThreadLocal: 创建一个线程本地变量. 本质:在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本. 优点:既实现多线程并发,游兼顾数据的安全性. 区别:Synchro ...
- Power-BI费用分析
费用分析主要从财务三大费用入手,剖析费用的结构.用途.占用等情况,从三大费用到明细费用.部门.职员的层层钻取,从而有效地进行费用管理和控制.Power-BI前端展示:图1<ignore_js_o ...
- MongoDB ObjectId
概述 > db.col.find() { , } { , } { , } { , } 每个文档中都有一个“_id”,她是一个12字节的BSON类型数据,格式如下 56c56dd4ca446fab ...
- 分享书籍[writing idiomatic python ebook]
你是不是总是觉得学了python好久,蓦然回首,总是感觉写的代码不是那么有pythonic的味道.看看别人的代码(django,webpy),再看看自己的代码,觉得就是一java-python的混合体 ...
- ASP.NET MVC Template
http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html http://st ...
- C# ?和??运算表达式
1.单问号(?) 作用:用于给变量设初化的时候,给变量(int类型)赋为null值,而不是0. 例子: public int a; //默认值为0 public int ?b; //默认值为null ...
- 《30天自制操作系统》02_day_学习笔记
helloos3: helloos.nas的解释在P29中 接下来课本讲了一些汇编语言的知识,便于理解这个汇编文件helloos4: 讲解在P41 helloos.nas后半部分去掉就成了ipl.as ...
- 2的m次方 内存对齐
在存储的时候,为了提高效率,一般都会让偏移量落在2的m次方的位置上,而且常有向上取整和向下取整两种需求.向下取整PALIGN_DOWN(x,align) (x & (- align)) 这样 ...