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

原创 2007年09月19日 16:05:00
上海的房价又在疯涨了,央行又加息了,邻居老大妈前几天丢的小狗居然自己跑回来了。多姿多彩的九月。
每一天的太阳都会不同,每一天的股市也一样。昨天绿油油的,今天红彤彤的,终于可歌可泣的迎来了人生中的第一次涨停。心情舒畅的一天。
有了这么好的大环境做铺垫,咱们的好戏也该开始了。
这以后的岁月里,主要就是结合代码去聊了,当然,新气象要用新代码,就使用最新的2.6.22版本的内核了。新的总会比旧的好,是么,总是只见新人笑,不见旧人哭。
在这什么都在失去理智飞涨的历史时刻,我会尽力的保持头脑的清醒,不会忘记自己要聊的是关于什么,所以,首先要去drivers/usb目录下走一走看一看。
atm class core gadget host image misc mon serial storage Kconfig Makefile README 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文件的内容了。
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

mt7620 wireless驱动特性意外发现

前言 今天又客户反映无线参数SSID编程了HT_AP0, 同事通过后台给他修改后反映给我,我想不对啊,难道是无线驱动crash了?那应该不能玩才对啊。。。 追查线索 我们的路由器会定期汇报数据S...

openwrt下iw命令应用

关于 iw iw 是一种新的基于 nl80211 的用于无线设备的CLI配置实用程序。它支持最近已添加到内核所有新的驱动程序。采用无线扩展接口的旧工具iwconfig已被废弃,强烈建...

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

新气象要用新代码,就使用最新的3.18.2版本的内核了。首先要去drivers/usb目录下走一走看一看。 atm class core gadget host image misc mon seri...
  • zhqh100
  • zhqh100
  • 2015年03月24日 14:00
  • 897

《Linux那些事儿之我是USB》我是U盘(10)我是谁的他?

probe,disconnect,id_table,这三个元素中首先要登场亮相的是id_table,它是干什么用的呢?我们说过,一个设备只能绑定一个驱动,但驱动并非只能支持一种设备。道理很简单,比如我...

Linux那些事儿 之 戏说USB(16)配置

接着看usb设备的配置吧,在include/linux/usb.h里定义 struct usb_host_config { struct usb_config_descriptor desc; ...
  • zhqh100
  • zhqh100
  • 2015年03月25日 11:04
  • 885

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

现在开始就沿着usb_generic_driver的成名之路走一走,设备的生命线你可以想当然的认为是从你的usb设备连接到hub的某个端口时开始,驱动的生命线就必须得回溯到usb子系统的初始化函数us...
  • zhqh100
  • zhqh100
  • 2015年03月26日 19:42
  • 594

Linux那些事儿 之 戏说USB(15)设备

struct usb_device结构冗长而又杂乱 include/linux/usb.h struct usb_device { int devnum; char devpath[16];...
  • zhqh100
  • zhqh100
  • 2015年03月25日 09:31
  • 945

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

回到struct usb_hcd,继续努力的往下看。 7行,又见kref,usb主机控制器的引用计数。struct usb_hcd也有自己专用的引用计数函数,看hcd.c文件 static void...
  • zhqh100
  • zhqh100
  • 2015年03月26日 10:48
  • 678

Linux那些事儿 之 戏说USB(28)设备的生命线(十一)

现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符、接口描述符还是端点描述符都不分男女不分彼此的挤在一...
  • zhqh100
  • zhqh100
  • 2015年03月26日 17:04
  • 879

Linux那些事儿 之 戏说USB(3)我是一棵树

从拓扑上来看,USB子系统并不以总线的方式来部署,它是一颗由几个点对点的连接构成的树。 它主要包括了USB连接、USB host controller和USB device三个部分。而USB...
  • zhqh100
  • zhqh100
  • 2015年03月24日 10:18
  • 511
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux那些事儿 之 戏说USB(10)好戏开始了
举报原因:
原因补充:

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