kernel\msm-3.18\drivers\usb下目录内容
我们msm8937+android7.1平台编译out目录下usb目录下有编译到的目录如下:
我们先参考kernel\msm-3.18\drivers\usb\README对这些部分的介绍。列举了一下usb目录各个文件有什么作用。接下来就是看Kconfig、Makefile文件的内容了。任何linux下驱动模块都必不可少的“地图”。总结下这个两个文件的作用吧,主要强调一下他俩的区别和联系:
Makefile定义了根据该子目录下的源码文件构建目标文件的规则。
为了理解所有的Linux-USB框架,需要用到下面的资源
(1) Usb驱动代码。
(2) USB2.0规范(网址www.usb.org),和一些补偿性的文档,比如关于USB OTG和不同设备类。USB2.0规范有的章节有很好的概述,和USB设备符合众做周知的第9章。
(3) USB控制器的芯片规范。比如包括主控制器(PC、服务器等等上),外围控制器(在带有linux固件的设备中,像打印机或是手机),以及像以太网适配器这样的硬件外围设备。
(4) USB外围功能对应的其他协议规范,一些是厂家特定的,其他是厂商共同制定的但又是www.usb.org团队之外制定的标准。
USB驱动源代码下的子目录说明如下:
USB host的核心代码,包括usbfs文件和HUB类驱动(hub_wq)。对应配置项CONFIG_USB,我们平台涉及的源代码文件如下:
usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
usbcore-y += devio.o notify.o generic.o quirks.o devices.o
usbcore-y += port.o
obj-$(CONFIG_USB) += usbcore.o
配置了CONFIG_USB表示支持USB主机端(host side),然后需要根据硬件平台支持的USB协议选择HCD(Host Controller Driver,主控制器驱动),比如我们CPU带有一个USB2.0高速端口,Type C,
所以需要配置CONFIG_USB_EHCI_HCD为Y。对应host\ehci-hcd.c
如果我们系统有一个USB设备端口,使用USB协议的外设端,参阅“USB gadget”框架。选择了HCD后,要选择我们将要使用的USB外设驱动。
2. Host
USB主控制器驱动,包括UHCI、OHCI、EHCI和其他可能专门用于嵌入式系统的部分。由CONFIG_USB_EHCI_HCD选项决定。
obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o
CONFIG_USB_EHCI_HCD=y,表示我们的USB主控制器支持USB2.0。
obj-$(CONFIG_USB_EHCI_MSM) += ehci-msm.o
CONFIG_USB_EHCI_MSM=y,启动高通芯片集中USB主控制器的支持。Root HUB内置TT(Transaction Translator事务翻译),此驱动依赖于OTG驱动来进行PHY初始化、时钟管理、为VBUS供电和电源管理。
3. Phy
由CONFIG_USB_SUPPORT选项指定,此选项添加了对USB的核心支持。
# Makefile for physical(PHY) layer USB drivers---通用代码
#
obj-$(CONFIG_USB_PHY) += phy.o
obj-$(CONFIG_OF) += of.o
obj-$(CONFIG_USB_OTG_WAKELOCK) += otg-wakelock.o
obj-$(CONFIG_DUAL_ROLE_USB_INTF) += class-dual-role.o
# transceiver(收发) drivers, keep the list sorted---和具体处理器平台相关的收发数据相关
obj-$(CONFIG_NOP_USB_XCEIV) += phy-generic.o
obj-$(CONFIG_USB_MSM_OTG) += phy-msm-usb.o
obj-$(CONFIG_USB_MSM_HSPHY) += phy-msm-hsusb.o
obj-$(CONFIG_USB_MSM_SSPHY) += phy-msm-ssusb.o
obj-$(CONFIG_USB_MSM_SSPHY_QMP) += phy-msm-ssusb-qmp.o
4. Gadget(小配件,小工具)
USB外围控制器驱动(对应上图右边的UDC驱动)和与UDC驱动交互的gadget驱动(对应上图右边的gadget function驱动)
USB是一个主/从协议,作为host(比如PC,手机也可以)可以控制多达127个从设备,USB硬件是非对称,这便于设置,我们不能将连接到“host端”的连接器连接到设备端。
Linux可运行在host或设备端,这两种情况下都需要一个低层总线控制器驱动。
如果我们要让linux运行在USB外网设备端,需要配置CONFIG_USB_GADGET=y。还需要为我们USB设备端总线控制器配置硬件驱动,和为我们外设协议配置对应的gadget驱动
Linux-USB Gadget API Framework
http://www.linux-usb.org/gadget/
下面是单个USB驱动目录,一个新的驱动应该增加到下面目录下的第1级子目录下。
5. Image/:静态图像驱动,如扫描仪或数字摄像头。
6. ../input/:任何使用输入子系统的驱动,如键盘,鼠标、触摸屏、平板。
7 ../media/:多媒体驱动,如摄像头、音频和任何其他和V4l子系统交互的其他驱动。
8. ../net/:网络驱动
9. Serial/:USB转串口驱动
由CONFIG_USB_SERIAL决定,如果我们有一个USB设备提供同样串口或者作为串口设备,并且我们需要连接它到我们产品的USB总线上(比如一个USB转串口设备要连接到我们android手机上。),需要配置CONFIG_USB_SERIAL=y。
涉及的主要源代码:
obj-$(CONFIG_USB_SERIAL) += usbserial.o
usbserial-y := usb-serial.o generic.o bus.o
10. Storage/:USB大容量存储驱动
由CONFIG_USB_STORAGE决定,如果我们想要连接USB大容量存储设备到我们PC的USB端口,这是USB软盘驱动器、USB硬盘、USB磁带驱动器、USB CD-ROM、USB闪存设备和记忆棒等类似设备所需要的驱动。
此选项既依赖于SCSI支持的启用,为了支持更多USB存储设备,我们可能还需要启动SCSI设备驱动(BLK_DEV_SD选项)
11. Class/:所有的USB设备驱动,这些驱动不适合上面的分类,作为特定的USB类设备工作。
obj-$(CONFIG_USB_ACM) += cdc-acm.o
CONFIG_USB_ACM对应的驱动支持USB modem和ISDN适配器,它支持通讯设备类抽象控制模式接口(Communication Device Class Abstract Control Model interface,CDC ACM)。
如果我们的modem /sys/kernel/debug/usb/devices描述符信息只报告"Cls=ff(vend.)",那么我们的modem不会使用这个驱动。
12. Misc/:所有不适合上面分类的USB设备驱动
13. Common
提供USB主端和设备端公共的代码。
obj-$(CONFIG_USB_COMMON) += usb-common.o
usb-common-y += common.o
14. Dwc3
如果我们系统有一个基于DesignWare HSOTG IP Core的双角色高速USB(a Dual Role Hi-Speed USB)控制器,可配置CONFIG_USB_DWC3=y。
15. Mon
USB抓包工具usbmon,对应CONFIG_USB_MON=y,此部分抓取在设备去和和HC驱动之间传输的USB数据包,便于debug和分析,详细的使用和介绍参阅内核文档usbmon.txt。
下面给出USB2.0协议里两张很重要的图,总体了解host和device之间的通讯
客户端软件的请求数据可以通过USB Host的buffer和USB device的endpoint传递。