没有合适的资源?快使用搜索试试~ 我知道了~
首页揭示Linux USB底层运作:一部深入浅出的指南
揭示Linux USB底层运作:一部深入浅出的指南
需积分: 9 13 下载量 93 浏览量
更新于2023-07-10
收藏 1.17MB PDF 举报
"《Linux下的USB结构详细描述》是一篇深入浅出的教程,出自博主"Linux那些事儿"系列中的《我是USBCore》。文章以轻松诙谐的笔调,通过故事化的叙述方式,讲解了Linux环境下USB(Universal Serial Bus)技术的工作原理和发展历程。作者从USB的历史说起,包括U盘和HUB的基本概念,然后逐步探讨了UHCI (Ultra High-Speed Host Controller Interface)和EHCI (Enhanced Host Controller Interface)的不同之处,以及USB Core在其中的核心作用。 文章分为多个部分,如“我型我秀”和“设备的生命线”等章节,详细剖析了USB设备如何被系统识别、配置和通信。读者能够跟随作者的脚步,理解USB设备的结构组成,包括接口、端点、配置表、驱动程序等关键概念。通过“设备的生命线”系列章节,作者生动地展示了USB设备如何与主机进行数据交换,以及驱动程序如何管理和控制这些交互。 此外,文章还涉及了字符串描述符、接口驱动的匹配机制等内容,这些都是理解USB工作原理不可或缺的部分。作者鼓励读者参与到讨论中,通过博客或邮件提出反馈,体现了作者希望读者能积极参与学习和交流的态度。 《Linux下的USB结构详细描述》不仅是一份技术指南,更是一次寓教于乐的探索之旅,让读者在轻松的阅读中深入了解Linux世界中的USB技术。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/2362562/bg10.jpg)
16
图里的 Interface 是怎么回事?这里先简单说说吧,反正代码里会不停的遇到再遇到。USB
端点被捆绑为接口(Interface),一个接口代表一个基本功能。有的设备具有多个接口,像
USB 扬声器就包括一个键盘接口和一个音频流接口。在内核里一个接口要对应一个驱动程
序,USB 扬声器在 linux 里就需要两个不同的驱动程序。到目前为止,可以这么说,一个
设备可以包括多个接口,一个接口可以具有多个端点,当然以后我们会发现并不仅仅止于此。
不过先说这么多吧,省得说得慷慨激昂,看的昏昏欲睡。
现在已经说了 USB 的历史发展体系结构等比较基本的东东,也就是协议的前几章,更多的
东东还是下面和代码一块说吧。为了纪念这个历史性的时刻,学学电影里的酷哥警察说句:
好戏开始了。
好戏开始了
上海的房价又在疯涨了,央行又加息了,邻居老大妈前几天丢的小狗居然自己跑回来了。多
姿多彩的九月。
每一天的太阳都会不同,每一天的股市也一样。昨天绿油油的,今天红彤彤的,终于可歌可
泣的迎来了人生中的第一次涨停。心情舒畅的一天。
有了这么好的大环境做铺垫,咱们的好戏也该开始了。
这以后的岁月里,主要就是结合代码去聊了,当然,新气象要用新代码,就使用最新的 2.6.22
版本的内核了。新的总会比旧的好,是么,总是只见新人笑,不见旧人哭。
![](https://csdnimg.cn/release/download_crawler_static/2362562/bg11.jpg)
17
在这什么都在失去理智飞涨的历史时刻,我会尽力的保持头脑的清醒,不会忘记自己要聊的
是关于什么,所以,首先要去 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
![](https://csdnimg.cn/release/download_crawler_static/2362562/bg12.jpg)
18
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 的使用,使得各
![](https://csdnimg.cn/release/download_crawler_static/2362562/bg13.jpg)
19
个厂商生产的 U 盘都能通过操作系统自带的统一的驱动程序来使用,对 U 盘的普及使用起
了极大的推动作用,制定其它这些 Class 也是为了同样的目的。
我们响应了 README 的呼唤,它便给予了我们想要的,通过它我们了解了 usb 目录里的那
些文件夹都有着什么样的角色。到现在为止,就只剩下 Kconfig、Makefile 两个文件了,
它们又扮演着什么样的角色那?就好像我吃东西总是喜欢把好吃的留在最后享受一样,我也
习惯于将重要的留在最后去描述。对于一个希望能够在 Linux 内核的汪洋代码里看到一丝
曙光的人来说,将它们放在怎么重要的地位都不过分。我们去香港,通过海关的时候,总会
有免费的地图啊各种指南拿,有了它们在手里我们才不至于无头苍蝇般迷惘的行走在陌生的
街道上。即使在境内出去旅游的时候一般来说也总是会首先找份地图,当然了,这时就是要
去买了,拿是拿不到的,不同的地方有不同的特色,不是么,别人的特色是服务,咱们的特
色是花钱,有的地方特色是一块石头,那这块石头收你 70 也不能嫌贵,有的山上特色是那
些多少年的洋房子,那就从进山收起吧,一个一个房子的来,口号就是不能让一分钱下山。
Kconfig、Makefile 就是 linux kernel 迷宫里的地图,我们每次浏览 kernel 寻找属于自己
的那一段代码时,都应该首先看看目录下的这两个文件。
不过,这里很明显,从俺的题目上就可以看出来,usb core 就是接下来需要关注的对象,
就不表 Kconfig、Makefile 文件的内容了。
不一样的 core
“生活中肯定还有比睡觉更好玩的事情!”大小卡梅拉们一直都抱有这样的信念。他们执著
地追求那些种群中认为不可想象的事情。去看大海、去摘星星、去追回逃逸的太阳……,一
路上处处坎坷、历经艰难,但总是逢凶化吉、化险为夷。最后还能收获超乎想象的回报和异
乎寻常的果实。卡梅拉已经被当作一种象征,一种成长路上必不可少的“伴侣”。读不一样
的卡梅拉,成就与众不同的你!读不一样的 core,成就不一样的你!
是不是像广告,嗯,确实是广告,是《不一样的卡梅拉》的广告。什么?不知道啥是卡梅拉?
唉,有代沟了,就是说一只小鸡不想只是下蛋睡觉去冒险的故事,小时候看的书了。那 core
那?嗯,这句是我加的,因为它也是咱们接下来的漫漫辛酸路上必不可少的伴侣。
使用命令 lsmod,看看它的输出,然后找这么个模块 usbcore,不要说你找不到,我不会
相信的。它是什么?它就是咱们这里要说的 usb 系统的核心,如果要在 linux 里使用 usb,
这个模块是必不可少的,另外,你应该在 usbcore那一行的后面看到 ehci_hcd或 uhci_hcd
这样的东东,它们就是前面说的 usb host controller 的驱动模块,你的 usb 设备要工作,
合适的 usb host controller 模块也是必不可少的。不过,咱们这里的主角还是 usbcore。
usb core 负责实现一些核心的功能,为别的设备驱动程序提供服务,提供一个用于访问和
![](https://csdnimg.cn/release/download_crawler_static/2362562/bg14.jpg)
20
控制 USB 硬件的接口,而不用去考虑系统当前存在哪种 host controller。至于 core、host
controller 和 driver 三者之间的关系,还是用 ldd3 里的图来说明吧。
driver 和 host controller 像不像 core 的两个保镖?没办法,这可是 core 啊。协议里也
说了,host controller 的驱动(HCD)必须位于 USB 软件的最下一层,任小强们也说了,
咱们必须位于房地产这个链子的最下一层。HCD 提供 host controller 硬件的抽象,隐藏
硬件的细节,在 host controller 之下是物理的 USB 及所有与之连接的 USB 设备。而 HCD
只有一个客户,对一个人负责,就是咱们的 USB core,USB 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"
剩余232页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)