Chinaunix
标题:
Linux是怎么知道设备被插入的?
[打印本页]
作者:
quanguoheme
时间:
2013-11-07 21:25
标题:
Linux是怎么知道设备被插入的?
我以前做过一个接触式购电卡模块,当卡插入机器时,单片机的一个外部引脚会从低电平变为高电平,因此触发单片产生外部中断.单片机才知道有卡插入.
那么Linux中的热插拔是怎么检测的呢?当设备被插入时linxu内核系统配置发生变化,当移动kobject时,一个通知会从内核空间发送到用户空间.这就是热插拔事件.热插拔事件导致udev或mdev被调用.
[fly]问题:Linux是怎么知道usb,sd卡等设备被插入的?[/fly]
作者:
quanguoheme
时间:
2013-11-12 10:52
现在的新内核都是通过udevd这个守护进程来监视硬件的。
当你的卡插入机器的时候,用一个外部中断换醒读卡器。
读卡器换醒之后发出一个中断,然后装载驱动。执行读卡操作。
udevd,我在pc机器上找了下,存在:
hkbdm@ubuntu:/quck/myandroid_boundary$ ps aux | grep ude
root 385 0.0 0.0 17232 304 ? S Nov11 0:00 upstart-udev-bridge --daemon
root 387 0.0 0.0 22004 312 ? Ss Nov11 0:00 /sbin/udevd --daemon
root 731 0.0 0.0 21752 240 ? S Nov11 0:00 /sbin/udevd --daemon
root 732 0.0 0.0 21752 260 ? S Nov11 0:00 /sbin/udevd --daemon
hkbdm 20430 0.0 0.0 11072 932 pts/2 S+ 10:41 0:00 grep --color=auto ude
hkbdm@ubuntu:/quck/myandroid_boundary$
但是,在mini2440开发板上没有找到:
# ps
PID USER VSZ STAT COMMAND
1 0 2048 S init
2 0 0 SW< [kthreadd]
3 0 0 SW< [ksoftirqd/0]
4 0 0 SW< [events/0]
5 0 0 SW< [khelper]
140 0 0 SW< [kblockd/0]
150 0 0 SW< [khubd]
154 0 0 SW< [kmmcd]
178 0 0 SW [pdflush]
179 0 0 SW [pdflush]
180 0 0 SW< [kswapd0]
227 0 0 SW< [aio/0]
231 0 0 SW< [nfsiod]
367 0 0 SW< [mtdblockd]
446 0 0 SW< [rpciod/0]
461 0 2052 S -/bin/sh
467 0 2052 R ps
---------------------------------------------------------------
问题是,在开发板上插入,sd卡,或者u盘 ,Linux设备是怎么检测到设备插入的?
作者:
linyunxian
时间:
2013-11-17 23:05
$ cat /proc/sys/kernel/hotplug
看看这个有没有?
作者:
quanguoheme
时间:
2013-11-19 12:11
本帖最后由 quanguoheme 于 2013-11-19 12:12 编辑
这个脚本,里面有个mdev -s ,这个就是启动mdev程序,可能这个就是检测的吧?
非常感谢chice,热插拔的检测原理解释的非常清楚,让人耳目一新,非常舒畅.
[quote=引用 3 楼 hygzxf 的回复:]
以usb为例。每个usb控制器都有个usb hub,在系统初始化的时候,usb hub设备注册的时候产生一个内核线程。当有设备插入hub的时候,hub芯片会检测到,这样当usb控制器来查询hub的时候。hub芯片会把有设备插入的信息通知控制器,然后控制器会发信息激活这个线程,这个线程就会自动给注册一个设备,完成后线程进入休眠等待下一次的激活。在注册设备的过程中,内核会发信息通知用户空间有设备插入,然后用户空间的热插拔相关的脚本程序会调用。自动做建立设备文件节点一类的工作。
[/quote]
usb_1.GIF
(68.8 KB, 下载次数: 19)
下载附件
2013-11-19 12:11 上传
疑问1:在usb层次中,这个"线程"是属于usb core层吗?或者是属于usb hub的功能,那么他的源码应该在usb hub 的驱动中对吧?
疑问2:"hub芯片会把有设备插入的信息通知USB控制器"在这个之后,USB控制器然后就会对这个插入设备进入枚举操作吧?不然,怎么得到设备的信息来初始化struct usb_device .然后进行设备注册?
疑问2:"这个"线程"就会自动给注册一个设备"注册函数在那里? :在linux-2.6.32.2\drivers\usb\core目录中没有找到一个给usb_device 进行注册的函数.
疑问3:"发信息激活这个线程"是怎么激活的?唤醒这个睡眠中线程的吗?
疑问:设备枚举是谁发出的? 应该是usb core吧?
我在补充一点hid的检测原理:
当未将device接入时,D+和D-的电压都是0V;当全速设备插入后,对于全速设备,上拉电阻是连在D+上的,上拉电阻(Rpu=1.5K)与USB HOST的下拉电阻(Rpd=15K)分压,使D+的电平为高,如果这个高有效持续2.5us以上,则USB hid认为有全速设备接入。拔掉device后,D+与D-又恢复低电平。
作者:
quanguoheme
时间:
2013-12-01 23:22
下面是我之前看代码分析的USB加载流程:
hub_thread:
这是USB集中器的驱动模块创建的内核线程khubd,他是用来专门处理集中器的状态变化的。
hub_events:
检查和处理各个集中器的状态变化。
hub_port_connect_change:
确定是状态变化了进一步处理。
usb_new_device:
处理新的USB设备。
usb_enumerate_device:
进行枚举。
device_add:
注册新设备。
bus_probe_device:
为新设备查找匹配驱动。
device_attach:
匹配驱动的进一步处理。
bus_for_each_drv(dev->bus, NULL, dev, __device_attach):
逐个驱动进行匹配。
以下函数是具体的匹配操作:
__device_attach
driver_match_device
driver_probe_device
really_probe
具体你可以看看内核代码。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2