免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2942 | 回复: 4
打印 上一主题 下一主题

Linux是怎么知道设备被插入的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-07 21:25 |只看该作者 |倒序浏览

我以前做过一个接触式购电卡模块,当卡插入机器时,单片机的一个外部引脚会从低电平变为高电平,因此触发单片产生外部中断.单片机才知道有卡插入.

那么Linux中的热插拔是怎么检测的呢?当设备被插入时linxu内核系统配置发生变化,当移动kobject时,一个通知会从内核空间发送到用户空间.这就是热插拔事件.热插拔事件导致udev或mdev被调用.
问题:Linux是怎么知道usb,sd卡等设备被插入的?

论坛徽章:
0
2 [报告]
发表于 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设备是怎么检测到设备插入的?

论坛徽章:
0
3 [报告]
发表于 2013-11-17 23:05 |只看该作者
$ cat /proc/sys/kernel/hotplug
看看这个有没有?

论坛徽章:
0
4 [报告]
发表于 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]

疑问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-又恢复低电平。

论坛徽章:
0
5 [报告]
发表于 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

具体你可以看看内核代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP