Linux那些事儿 之 戏说USB(11)不一样的core

“生活中肯定还有比睡觉更好玩的事情!”大小卡梅拉们一直都抱有这样的信念。他们执著地追求那些种群中认为不可想象的事情。去看大海、去摘星星、去追回逃逸的太阳……,一路上处处坎坷、历经艰难,但总是逢凶化吉、化险为夷。最后还能收获超乎想象的回报和异乎寻常的果实。卡梅拉已经被当作一种象征,一种成长路上必不可少的“伴侣”。读不一样的卡梅拉,成就与众不同的你!读不一样的core,成就特立独行的你!
是不是像广告,嗯,确实是广告,是《不一样的卡梅拉》的广告。什么?不知道啥是卡梅拉?唉,有代沟了,就是说一只小鸡不想只是下蛋睡觉去冒险的故事,小时候看的书了。那core那?嗯,这句是我加的,因为它也是咱们接下来的漫漫辛酸路上必不可少的伴侣。
使用命令lsmod,看看它的输出,然后找这么个模块usbcore,不要说你找不到,我不会相信的。它是什么?它就是咱们这里要说的usb系统的核心,如果要在linux里使用usb,这个模块是必不可少的,另外,你应该在usbcore那一行的后面看到ehci_hcd或uhci_hcd这样的东东,它们就是前面说的usb host controller的驱动模块,你的usb设备要工作,合适的usb host controller模块也是必不可少的。不过,咱们这里的主角还是usbcore。
usb core负责实现一些核心的功能,为别的设备驱动程序提供服务,提供一个用于访问和控制USB硬件的接口,而不用去考虑系统当前存在哪种host controller。至于corehost controllerdriver三者之间的关系,还是用ldd3的图来说明吧。

driverhost controller像不像core的两个保镖?没办法,这可是core啊。协议里也说了,host controller的驱动(HCD)必须位于USB软件的最下一层,任小强们也说了,咱们必须位于房地产这个链子的最下一层。HCD提供host controller硬件的抽象,隐藏硬件的细节,在host controller之下是物理的USB及所有与之连接的USB设备。而HCD只有一个客户,对一个人负责,就是咱们的USB coreUSB core将用户的请求映射到相关的HCD,用户不能直接访问HCD

咱们写USB驱动的时候,只能调用core的接口,core会将咱们的请求发送给相应的HCD,用得着咱们操心的只有这么一亩三分地,core为咱们完成了大部分的工作,linux的哲学是不是和咱们生活中不太一样那?

走到drivers/usb/core里去,使用ls瞧一瞧看一看,

Kconfig  Makefile  buffer.c  config.c  devices.c  devio.c  driver.c  endpoint.c  file.c  generic.c  hcd-pci.c  hcd.c  hcd.h  hub.c  hub.h  inode.c  message.c  notify.c  otg_whitelist.h  quirks.c  sysfs.c  urb.c  usb.c  usb.h

使用wc –l命令统计一下,将近两万行的代码,core不愧是core,为大家默默的做这么多事,人民的好公仆鞠躬尽瘁,我会用一颗感恩的心去深刻理解你的内心回报你的付出的。Linux背后的哲学是不是又和我们生活中不一样?

不过这么多文件里不一定都是我们所需要关注的,好钢要用在刃上,先拿咱们的地图来看看接下来该怎么走。先看看Kconfig文件

4 config USB_DEBUG
5          bool "USB verbose debug messages"
6          depends on USB
7          help
8            Say Y here if you want the USB core & hub drivers to produce a bunch
9            of debug messages to the system log. Select this if you are having a
10            problem with USB support and want to see more of what is going on.

这是USB的调试tag,如果你在写USB设备驱动的话,最好还是打开它吧,不过这里它就不是我们关注的重点了。

15 config USB_DEVICEFS
16          bool "USB device filesystem"
17          depends on USB
18          ---help---
19            If you say Y here (and to "/proc file system support" in the "File
20            systems" section, above), you will get a file /proc/bus/usb/devices
21            which lists the devices currently connected to your USB bus or
22            busses, and for every connected device a file named
23           "/proc/bus/usb/xxx/yyy", where xxx is the bus number and yyy the
24           device number; the latter files can be used by user space programs
25           to talk directly to the device. These files are "virtual", meaning
26           they are generated on the fly and not stored on the hard drive.
27
28           You may need to mount the usbfs file system to see the files, use
29           mount -t usbfs none /proc/bus/usb
30
31           For the format of the various /proc/bus/usb/ files, please read
32           <file:Documentation/usb/proc_usb_info.txt>.
33
34           Usbfs files can't handle Access Control Lists (ACL), which are the
35           default way to grant access to USB devices for untrusted users of a
36           desktop system. The usbfs functionality is replaced by real
37           device-nodes managed by udev. These nodes live in /dev/bus/usb and
38           are used by libusb.

这个选项是关于usbfs文件系统的。usbfs文件系统挂载在/proc/bus/usb(mount -t usbfs none /proc/bus/usb),显示了当前连接的USB设备及总线的各种信息,每个连接的USB设备在其中都会有一个文件进行描述。比如文件/proc/bus/usb/xxx/yyyxxx表示总线的序号,yyy表示设备在总线的地址,不过不能够依赖它们来稳定地访问设备,因为同一设备两次连接对应的描述文件可能会不同,比如,第一次连接一个设备时,它可能是002/027,一段时间后再次连接,它可能就已经改变为002/048。就好比好不容易你暗恋的mm今天见你的时候对你抛了个媚眼,你心花怒放,赶快去买了100块彩票庆祝,到第二天再见到她的时候,她对你说你是谁啊,你悲痛欲绝的刮开那100块彩票,上面清一色的谢谢你,谢谢你送钱。usbfs与咱们探讨的主题关系不大,况且也已经足可以开个专题来讨论了,咱们以后聊的时候也不会去过多提及它。

74 config USB_SUSPEND
75         bool "USB selective suspend/resume and wakeup (EXPERIMENTAL)"
76         depends on USB && PM && EXPERIMENTAL
77         help
78           If you say Y here, you can use driver calls or the sysfs
79           "power/state" file to suspend or resume individual USB
80           peripherals.
81
82           Also, USB "remote wakeup" signaling is supported, whereby some
83           USB devices (like keyboards and network adapters) can wake up
84           their parent hub.  That wakeup cascades up the USB tree, and
85           could wake the system from states like suspend-to-RAM.
86
87           If you are unsure about this, say N here.

这一项是有关usb设备的挂起和恢复。开发USB的人都是节电节能的好孩子,所以协议里就规定了,所有的设备都必须支持挂起状态,就是说为了达到节电的目的,当设备在指定的时间内,3ms吧,如果没有发生总线传输,就要进入挂起状态。当它收到一个non-idle的信号时,就会被唤醒。在这里呼吁一下,多利用利用有太阳的时候,少熬夜,又费电对身体又不好,不过,我应该明天才说这句话,因为半夜还有米兰的冠军杯那。节约用电从USB做起。不过目前来说内核对挂起休眠的支持普遍都不太好,而且许多的USB设备也没有支持它,还是暂且不表了。

剩下的还有几项,不过似乎与咱们关系也不大,碰到再去说它,还是看看Makefile。惭愧,差点打成Makelove,看复旦人甲的文章看的了,这样的词汇总是很有感染力的,是不。

5 usbcore-objs    := usb.o hub.o hcd.o urb.o message.o driver.o /
6                         config.o file.o buffer.o sysfs.o endpoint.o /
7                         devio.o notify.o generic.o quirks.o
8
9 ifeq ($(CONFIG_PCI),y)
10         usbcore-objs    += hcd-pci.o
11 endif
12
13 ifeq ($(CONFIG_USB_DEVICEFS),y)
14          usbcore-objs    += inode.o devices.o
15 endif
16
17 obj-$(CONFIG_USB)       += usbcore.o
18
19 ifeq ($(CONFIG_USB_DEBUG),y)
20 EXTRA_CFLAGS += -DDEBUG
21 endif

Makefile可比Kconfig简略多了,所以看起来也更亲切点,咱们总是拿的money越多越好,看的代码越少越好。这里之所以会出现CONFIG_PCI,是因为通常USBroot hub包含在一个PCI设备中,前面也已经聊过了。hcd-pcihcd顾名而思义就知道是说host controller的,它们实现了host controller公共部分,按协议里的说法它们就是HCDIHCD的公共接口),host目录下则实现了各种不同的host controller,咱们这里不怎么会聊到具体host controller的实现。CONFIG_USB_DEVICEFS前面的Kconfig文件里也见到了,关于usbfs的,与咱们的主题无关,inode.cdevices.c两个文件也可以不用管了。

这么看来,好像大都需要关注的样子,没有减轻多少压力,不过这里本身就是usb core部分,是要做很多的事为咱们分忧的,所以多点也是可以理解的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值