Linux那些事儿之我是Hub(1)跟我走吧,现在就出发

最早知道hub是在大学里,复旦的4人间宿舍,条件真好,每个人一张书桌,书桌下面一个网口,但是有时候网口坏了,那可急死人了,要知道当初我们买电脑初衷虽说是为了学习C语言,可是买了之后,C倒是没学,先学了CS.printf还没学会呢,倒是先学会了怎么在CS里喊go go go, fire in the hole!网口坏了就意味着CS不能玩了,当时对人生真的很绝望,后来有人介绍,6楼几个哥们也有这种情况,然后人家买了hub.所以网口坏了也没事.当时我这个兴奋啊!比过了六级还要high…

事情过了几年,今天我再次回过头来看hub,不过这里看的是usb中的hub.但是很显然,和我们在以太网用的hub不是一回事,但是角色是一样的,都说红花需要绿叶配,usb的世界里,hub永远都只是绿叶,她不可能是红花,她的存在只是为了支持更多的设备连接到usb总线上来,谁也不会为了使用hub而购买hub,hub的原因是为了要使用别的设备,hub就像嫁妆,仅此而已.就像当年我们买hub是为了使用网卡,而不是hub本身.

也许设计代码的人和我一样,希望大家能够更多的给hub一点关注,所以,关于hub的代码在usb core的目录下面.

这个故事中使用的是2.6.22.1的内核代码,这是此刻我能从kernel.org上面获得的最新的内核版本.Linux内核代码目录中所有去设备驱动程序有关的代码都在drivers/目录下面,在这个目录中的usb子目录包含了所有usb设备的驱动,usb目录下面又有它自己的子目录,进去看一下,

localhost:/usr/src/linux-2.6.22.1/drivers # cd usb/

localhost:/usr/src/linux-2.6.22.1/drivers/usb # ls

Kconfig  Makefile  README  atm  class  core  gadget  host  image  misc  mon  serial  storage  usb-skeleton.c

注意到每一个目录下面都有一个Kconfig文件和一个Makefile,这很重要.古训有云,再牛B的肖邦也弹不出老子的忧伤,我想说的是,再牛B的黑客如果不看Makefile不看Kconfig,也别想搞清楚这里的结构.很多年轻人喜欢研究usb-skeleton.c,据说这个文件对他们很有启发,所以这里偶也友情推荐一下这个文件.有时间有兴趣的可以看一看,其实就是一个简单的usb设备驱动程序的框架.

关于Makefile,在当年我们讲usb storage的时候已经讲了一些,这里就不重复了,反反复复讲Makefile是不是太没品了点?要是我室友知道了,肯定会问,是不是男人?不过一个很显然的事实摆在这里,在这众多的目录中,我们一眼就能看到有一个叫做core的目录,虽然四六级都是刚刚擦边过,可是core这个词咱们可没少用.当年,和这个词一起走红的另外两个英语单词是simple,naïve.

,我们来看core目录.关于usb,有一个很重要的模块,她的名字耐人追寻,usbcore.如果你的电脑是装了Linux,那么你用lsmod命令看一下,有一个模块叫做usbcore.当然,你要是玩嵌入式系统的高手,那么也许你的电脑里没有usb模块,不过我听说如今玩嵌入式的人也喜欢玩usb,因为usb设备很合嵌入式的口味.看看我的lsmod的输出吧,

localhost:/usr/src/linux-2.6.22.1/drivers/usb/core # lsmod

Module                  Size  Used by

af_packet              55820  2

raw                    89504  0

nfs                   230840  2

lockd                  87536  2 nfs

nfs_acl                20352  1 nfs

sunrpc                172360  4 nfs,lockd,nfs_acl

ipv6                  329728  36

button                 24224  0

battery                27272  0

ac                     22152  0

apparmor               73760  0

aamatch_pcre           30720  1 apparmor

loop                   32784  0

usbhid                 60832  0

dm_mod                 77232  0

ide_cd                 57120  0

hw_random              22440  0

ehci_hcd               47624  0

cdrom                  52392  1 ide_cd

uhci_hcd               48544  0

shpchp                 61984  0

bnx2                  157296  0

usbcore               149288  4 usbhid,ehci_hcd,uhci_hcd

e1000                 130872  0

pci_hotplug            44800  1 shpchp

reiserfs              239616  2

edd                    26760  0

fan                    21896  0

thermal                32272  0

processor              50280  1 thermal

qla2xxx               149484  0

firmware_class         27904  1 qla2xxx

scsi_transport_fc      51460  1 qla2xxx

sg                     52136  0

megaraid_sas           47928  3

piix                   27652  0 [permanent]

sd_mod                 34176  4

scsi_mod              163760  5 qla2xxx,scsi_transport_fc,sg,megaraid_sas,sd_mod

ide_disk               32768  0

ide_core              164996  3 ide_cd,piix,ide_disk

找到了usbcore那一行吗?core就是核心,基本上你要在你的电脑里用usb设备,那么两个模块是必须的,一个是usbcore,这就是核心模块,另一个是主机控制器的驱动程序,比如这里usbcore那一行我们看到的ehci_hcduhci_hcd,这里偶的是Dell2950的服务器,里边有两个usb host controller.一个是echi,三个是uhci.你问我什么是ehci?什么是ohci?就是host controller的接口.从硬件上来说,usb设备要想工作,除了外设本身,必须还有一个咚咚叫做usb host controller.一般来说,一个电脑里有一个usb host controller就可以了,她就可以控制很多个设备了,比如u,比如usb键盘,比如usb鼠标.所有的外设都把自己的请求提交给usb host controller.然后让usb host controller统一来调度.而设备怎么连到host controller?,这就是我们故事的主角,hub,乳名叫做集线器.

关于hub的代码,drivers/usb/core/目录下面,有一个叫做hub.c的文件.这个文件可不简单.

localhost:/usr/src/linux-2.6.22.1/drivers/usb/core # wc -l hub.c

3122 hub.c

傻眼了,hub这么一个玩艺儿竟然有三千多行代码,真要是按行计费,写代码的那些家伙还不发财发死?还好不是那样,真要是那样,还不个个都跟赵丽华似的,一个个都成了诗人,开源社区该改成开源诗社了.

三千多行就三千多行吧,总不能见困难就退吧.小的时候我们可都是听着雷锋叔叔的故事长大的,雷锋叔叔的螺丝钉的精神虽然我们学不到,但是雷锋叔叔说的好,对待女同志,要像春天般的温暖!同样,我们对待代码,也要像春天般的温暖.,跟我走吧,现在就出发.

你可能感兴趣的:(linux,嵌入式,Random,Class,ide,makefile)