USB学习5---android usb驱动源代码目录说明
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傳遞。
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的USB学习5---android usb驱动源代码目录说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android通过cat /sys/ke
- 下一篇: USB学习6---Linux Andro