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驱动源代码下的子目录说明如下:

  1. Core

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传递。

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐