很快就要学习usb的驱动,心中很是激动,但是还会想起早上一兄弟,竟然“人肉”到walfred的姓名/住址/邮箱,nnd什么世道,我招谁惹谁了?
带着忐忑不安的心,还是现阅读下usb的readme文档吧。
这个readme文档算是一个引导性的玩意,只有usb才有资格拥有,其他的,至少我上次看的mmc子系统就没有,那时看的walfred晕头转向的。现在好了,我们就跟着readme的步伐,走进新时代吧。
位置usb/README,英语不是很好,勉强翻译下,以帮助那些和我一样一看到英语就想吐的强烈爱国只看母语的银。
1.readme告诉你,需要带着几样东西来阅读usb sourcecode。诸如Documentation/usb, USB 2.0 specification还有Chip specifications for USB controllers(主控制器),还有一些外围设备的协议等。内核帮助文档Documentation/usb还真的有一坨东西呢,暂且不管。对了上篇usb子系统基础学习一请留意学习。
2.usb 驱动组织的各子目录
USB 设备根据其用于,可以分为若干类。 Linux 内核中,按照这些分类来组织驱动。
core/ : USB 子系统的核心代码,包括 usbfs 文件以及 hub 类 (class) 的驱动。
host/ : USB host controller 驱动,包括 UHCI, OHCI, EHCI 等以及一些嵌入式系统使用的主控制器。
gadget/ : USB 外部控制器驱动, 以及与外部控制器交互的若干部件的驱动。
image/ : 图像相关驱动,如扫描仪、数码相机等。
../input/ : 输入相关驱动,如键盘、鼠标,触摸屏等。
../media/ : 多媒体驱动,如摄像头等。
../net/ : 网卡驱动。
serial/ : USB/串口转接器的驱动。
storage/: 存储相关,如 U 盘。
看看什么才叫组织
这个framework真似忽如一夜春风吹过来,甚是清朗了许多,但是我们又该从哪个地方下手开始呢?犯愁ing。。。
正如上面的框架介绍,我们已经基本明白了我这个usb(确切的说是大牛的)基本上就分成这3层。
最底层:host controller driver;
中间层:core目录下可知有hub,usbfs相关;
上层:外围设备。
有组织,可别忘了组织结构
上面我们已经知道了基本上usb就是主控制器/hub/设备这个三样。看看它的拓扑结构总比我在这边空口说白话强多了。
USB 总线有且仅有一个总控制器 (root controller),其他的设备通过 hub 连接到总线上, 形成了一个树形结构,最多可连接 127 个设备。 该结构如下图所示:
USB 结构
刚才提到,终端设备必要时需要通过 Hub 连接到 root controller 上, 为了让 USB 设备的驱动对这个结构有一个统一的描述,内核将总控制器模拟成了一个虚拟 hub , 这样在驱动开发中可以不用区分总控制器和普通 hub, 简化了驱动开发过程。
此外,尽管 USB 子系统的各个设备在物理上是一个树形结构,但对于 USB 设备的驱动来讲, 驱动并不需要关心这种树形结构:无论一个设备是直接连到总控制器上或是通过 hub 连接, 该设备都会由内核分配一个唯一的标识符(设备 ID),驱动和内核通过这个 ID 来指代这个设备, 从而从逻辑上看,可以认为这些设备都是直接连到了总控制器上,如下图所示:
那么组织的任务是什么呢?
组织不是吃白饭的,组织也不是是靠一个人来维持,收到一个人影响的,你只要记住了组织具有组织性的,算了我也说不明白,你只要记住这个组织绝不是中国红十字会于郭美美就行。
USB 子系统主要任务包括:
1.注册和管理设备驱动。
2.为 USB 设备寻找驱动,并初始化和配置设备。
3.在内核中表现设备的树形结构。
4.与设备交互。
在 Linux 内核中, 该完成这些任务的子系统由两层构成。
Host Controller 驱动--即主控制器驱动。 控制器向 USB 链提供连接选项,并向终端设备提供电路上的通讯。 控制器本身则必需连接到其他系统总线上。 当前, USB 控制器主要可分为 OHCI, EHCI 和 UHCI 几类。
终端设备驱动--设备驱动负责与各个 USB 设备打交道,并将该设备的功能提供给内核的其他部分。 设备驱动通过标准化的接口来与 host controller通讯,从而分离了控制器类型和设备驱动。