Linux那些事儿 之 戏说USB(10)好戏开始了

上海的房价又在疯涨了,央行又加息了,邻居老大妈前几天丢的小狗居然自己跑回来了。多姿多彩的九月。
每一天的太阳都会不同,每一天的股市也一样。昨天绿油油的,今天红彤彤的,终于可歌可泣的迎来了人生中的第一次涨停。心情舒畅的一天。
有了这么好的大环境做铺垫,咱们的好戏也该开始了。
这以后的岁月里,主要就是结合代码去聊了,当然,新气象要用新代码,就使用最新的2.6.22版本的内核了。新的总会比旧的好,是么,总是只见新人笑,不见旧人哭。
在这什么都在失去理智飞涨的历史时刻,我会尽力的保持头脑的清醒,不会忘记自己要聊的是关于什么,所以,首先要去drivers/usb目录下走一走看一看。
atmclasscoregadgethostimagemiscmonserialstorage KconfigMakefileREADME usb-skeleton.c
ls命令的结果就是上面的10个目录和4个文件。usb-skeleton.c是一个简单的usb driver的框架,感兴趣的可以去看看,目前来说,它还吸引不了我的眼球。那么首先应该关注什么?如果迎面走来一个ppmm,你会首先看脸、脚还是其它?当然答案依据每个人的癖好会有所不同。不过这里的问题应该只有一个答案,那就是Kconfig、Makefile、README。
README里有关于这个目录下内容的一般性描述,它不是关键,只是帮助你了解。再说了,面对读我吧读我吧这么热情奔放的呼唤,善良的我们是不可能无动于衷的,所以先来看看里面都有些什么内容。
23 Here is a list of what each subdirectory here is, and what is contained in
24 them.
25
26 core/ - This is for the core USB host code, including the
27 usbfs files and the hub class driver ("khubd").
28
29 host/ - This is for USB host controller drivers.This
30 includes UHCI, OHCI, EHCI, and others that might
31 be used with more specialized "embedded" systems.
32
33 gadget/ - This is for USB peripheral controller drivers and
34 the various gadget drivers which talk to them.
35
36
37 Individual USB driver directories.A new driver should be added to the
38 first subdirectory in the list below that it fits into.
39
40 image/ - This is for still image drivers, like scanners or
41 digital cameras.
42 input/ - This is for any driver that uses the input subsystem,
43 like keyboard, mice, touchscreens, tablets, etc.
44 media/ - This is for multimedia drivers, like video cameras,
45 radios, and any other drivers that talk to the v4l
46 subsystem.
47 net/ - This is for network drivers.
48 serial/ - This is for USB to serial drivers.
49 storage/ - This is for USB mass-storage drivers.
50 class/ - This is for all USB device drivers that do not fit
51 into any of the above categories, and work for a range
52 of USB Class specified devices.
53 misc/ - This is for all USB device drivers that do not fit
54 into any of the above categories.
drivers/usb/README文件就描述了前面ls列出的那10个文件夹的用途。那么什么是usb core?复旦人甲说得好。Linux内核开发者们,专门写了一些代码, 负责实现一些核心的功能,为别的设备驱动程序提供服务,比如申请内存,比如实现一些所有的设备都会需要的公共的函数,并美其名曰usb core。时代总在发展,当年胖杨贵妃照样迷死唐明皇,而如今人们欣赏的则是林志玲这样的魔鬼身材。同样,早期的Linux内核,其结构并不是如今天这般有层次感,远不像今天这般错落有致,那时候drivers/usb/这个目录下边放了很多很多文件,usb core与其他各种设备的驱动程序的代码都堆砌在这里,后来,怎奈世间万千的变幻,总爱把有情的人分两端。于是在drivers/usb/目录下面出来了一个core目录,就专门放一些核心的代码,比如初始化整个usb系统,初始化root hub,初始化host controller的代码,再后来甚至把host controller相关的代码也单独建了一个目录,叫host目录,这是因为usb host controller随着时代的发展,也开始有了好几种,不再像刚开始那样只有一种,所以呢,设计者们把一些host controller公共的代码仍然留在core目录下,而一些各host controller单独的代码则移到host目录下面让负责各种host controller的人去维护。
那么usb gadget那?gadget白了说就是配件的意思,主要就是一些内部运行linux的嵌入式设备,入PDA,设备本身有USB设备控制器(usb device controller),可以将PC,也就是我们的host作为master端,将这样的设备作为slave端和PC通过USB进行通信。从host的观点来看,主机系统的USB驱动程序控制插入其中的USB设备,而usb gadget的驱动程序控制外围设备如何作为一个USB设备和主机通信。比如,我们的嵌入式板子上支持SD卡,如果我们希望在将板子通过USB连接到PC之后,这个SD卡被模拟成U盘,那么就要通过usb gadget架构的驱动。
gadget目录下大概能够分为两个模块,一个是udc驱动,这个驱动是针对具体cpu平台的,如果找不到现成的,就要自己实现。另外一个就是gadget驱动,主要有file_storage、ether、serial等。另外还提供了USB gadget API,即USB设备控制器硬件和gadget驱动通信的接口。PC及服务器只有USB主机控制器硬件,它们并不能作为USB gadget存在,而对于嵌入式设备,USB设备控制器常被集成到处理器中,设备的各种功能,如U盘、网卡等,常依赖这种USB设备控制器来与主机连接,并且设备的各种功能之间可以切换,比如可以根据选择作为U盘或网卡等。
剩下的几个目录分门别类的放了各种USB设备的驱动,U盘的驱动在storage目录下,触摸屏和USB键盘鼠标的驱动在input目录下,等等。多说一下的是,Usb 协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class 协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容。这些Class 协议的数量非常多,最常见的比如支持U 盘功能的Mass Storage Class,以及通用的数据交换协议:CDC class。此外还包括Audio Class, Print Class 等等。理论上说,即使没有这些Class,通过专用驱动也能够实现各种各样的应用功能。但是,正如Mass StorageClass 的使用,使得各个厂商生产的U盘都能通过操作系统自带的统一的驱动程序来使用,对U盘的普及使用起了极大的推动作用,制定其它这些Class 也是为了同样的目的。
我们响应了README的呼唤,它便给予了我们想要的,通过它我们了解了usb目录里的那些文件夹都有着什么样的角色。到现在为止,就只剩下Kconfig、Makefile两个文件了,它们又扮演着什么样的角色那?就好像我吃东西总是喜欢把好吃的留在最后享受一样,我也习惯于将重要的留在最后去描述。对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都不过分。我们去香港,通过海关的时候,总会有免费的地图啊各种指南拿,有了它们在手里我们才不至于无头苍蝇般迷惘的行走在陌生的街道上。出去旅游的时候一般来说也总是会首先找份地图,当然了,这时就是要去买了,拿是拿不到的,不同的地方有不同的特色,不是么,别人的特色是服务,咱们的特色是花钱,有的地方特色是一块石头,那这块石头收你70也不能嫌贵,有的山上特色是那些多少年的洋房子,那就从进山收起吧,一个一个房子的来,口号就是不能让一分钱下山。Kconfig、Makefile就是linux kernel迷宫里的地图,我们每次浏览kernel寻找属于自己的那一段代码时,都应该首先看看目录下的这两个文件。
不过,这里很明显,要想了解USB协议在内核里的实现,usb core就是我们需要关注的对象,就不表Kconfig、Makefile文件的内容了。

你可能感兴趣的:(linux)