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

原创 2007年09月20日 09:38:00
“生活中肯定还有比睡觉更好玩的事情!”大小卡梅拉们一直都抱有这样的信念。他们执著地追求那些种群中认为不可想象的事情。去看大海、去摘星星、去追回逃逸的太阳……,一路上处处坎坷、历经艰难,但总是逢凶化吉、化险为夷。最后还能收获超乎想象的回报和异乎寻常的果实。卡梅拉已经被当作一种象征,一种成长路上必不可少的“伴侣”。读不一样的卡梅拉,成就与众不同的你!读不一样的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部分,是要做很多的事为咱们分忧的,所以多点也是可以理解的。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

使用命令lsmod,看看它的输出,然后找这么个模块usbcore,不要说你找不到,我不会相信的。它是什么?它就是咱们这里要说的usb系统的核心,如果要在linux里使用usb,这个模块是必不可少的,另...
  • zhqh100
  • zhqh100
  • 2015年03月24日 14:12
  • 743

Linux那些事儿 之 戏说USB(11)繁华落尽

Linux设备模型中的总线落实在USB子系统里就是usb_bus_type,它在usb_init函数注册,在drivers/usb/core/driver.c文件里定义 struct bus_typ...
  • zhqh100
  • zhqh100
  • 2015年03月24日 16:26
  • 439

Linux那些事儿之我是USB Core(v1.0)

  • 2007年11月05日 16:36
  • 1.17MB
  • 下载

《Linux那些事儿之我是USB》我是U盘(11)从协议中来到协议中去

任何事物都有其要遵守的规矩。USB设备要遵循的就是USB协议。 不管是软件还是硬件,在设计的开始,总是要参考USB协议。怎么设计硬件?如何编写软件?不看USB协议,谁也不可能凭空想象出来。...

Linux那些事儿 之 戏说USB(30)驱动的生命线(二)

core配置设备使用的是message.c里的usb_set_configuration函数 int usb_set_configuration(struct usb_device *dev, int...
  • zhqh100
  • zhqh100
  • 2015年03月26日 20:17
  • 656

Linux那些事儿 之 戏说USB(13)接口是设备的接口(二)

前面struct usb_interface里表示接口设置的struct usb_host_interface就被有意无意的飘过了,咱们在这里看看它的真面目,同样在include/linux/usb....
  • zhqh100
  • zhqh100
  • 2015年03月24日 17:03
  • 684

Linux那些事儿 之 戏说USB(4)最终奥义

一个完整的USB系统应该实现上面图里的各个部分,图里主要显示了四个层次,USB物理设备(USB Physical Device)、客户软件(Client SW)、USB系统软件(USB System ...
  • zhqh100
  • zhqh100
  • 2015年03月24日 10:40
  • 518

Linux那些事儿 之 戏说USB(20)设备的生命线(三)

函数usb_control_msg调用了usb_internal_control_msg之后就去一边儿睡大觉了,脏活儿累活儿,全部留给usb_internal_control_msg去做了,这才叫骨干...
  • zhqh100
  • zhqh100
  • 2015年03月25日 15:37
  • 663

Linux那些事儿 之 戏说USB(2)漫漫辛酸路

USB的一生充满了PK,并在PK中发展,1.0、1.1、2.0,漫漫辛酸路,一把辛酸泪。我们又何尝不是,上学碰到实行自费,毕业碰到IT崩溃,工作碰到房价见鬼,现在又碰到股市泡沫,与房价PK,与庄家PK...
  • zhqh100
  • zhqh100
  • 2015年03月24日 10:01
  • 490

Linux那些事儿 之 戏说USB(29)驱动的生命线(一)

现在开始就沿着usb_generic_driver的成名之路走一走,设备的生命线你可以想当然的认为是从你的usb设备连接到hub的某个端口时开始,驱动的生命线就必须得回溯到usb子系统的初始化函数us...
  • zhqh100
  • zhqh100
  • 2015年03月26日 19:42
  • 594
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux那些事儿 之 戏说USB(11)不一样的core
举报原因:
原因补充:

(最多只允许输入30个字)