【linux】USB开发实例[1] - kernel config

本文详细介绍了Linux环境下USB配置的相关选项,包括USB控制器、设备支持、声卡及多媒体设备等,并展示了实际编译配置示例。

0. 环境

linux-4.4

10. 概述

  1. 多媒体设备
CONFIG_MEDIA_SUPPORT 										// 多媒体设备支持
	CONFIG_MEDIA_USB_SUPPORT								// 各类USB总线的多媒体设备
		CONFIG_USB_VIDEO_CLASS								// UVC协议,免驱摄像头协议
			CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV				// 摄像头按钮
		CONFIG_USB_GSPCA									// 非UVC摄像头的驱动
  1. 声卡支持
CONFIG_SOUND						// 声卡支持
	CONFIG_SND						// ALSA(高级Linux声音架构)
		CONFIG_SND_USB				// 基于USB总线的声卡,如外接声卡
  1. 人机接口
CONFIG_HID					// 人机接口 
	CONFIG_USB_HID			// 基于USB的HID接口
	CONFIG_USB_HIDDEV		// 严格来书不算USB HID的设备支持
  1. 通用串行总线(universal serial bus)
CONFIG_USB_SUPPORT								// USB支持
	CONFIG_USB									// USB host支持
		CONFIG_USB_DEBUG							// 调试
		CONFIG_USB_ANNOUNCE_NEW_DEVICES				// 记录设备信息,主要用于调试
		CONFIG_USB_DEFAULT_PERSIST					// 总线挂起是提供小电流保持USB设备状态
		CONFIG_USB_DYNAMIC_MINORS					// 动态分配USB主次设备号
		CONFIG_USB_OTG								// OTG支持
		CONFIG_USB_OTG_WHITELIST					// OTG白名单(otg_whitelist.h)外的设备不会初始化,嵌入式设备建议选N
		CONFIG_USB_OTG_BLACKLIST_HUB				// 是否静止初始化外部HUB
		CONFIG_USB_ULPI_BUS							// USB PHY,仅适用于嵌入式环境
		CONFIG_USB_MON								// 捕获USB流量,是否支持
		CONFIG_USB_WUSB								// 主机端无线USB的支持
		CONFIG_USB_WUSB_CBAF						// 安全措施,建立无线USB支持前必须优先连接
			CONFIG_USB_WUSB_CBAF_DEBUG				// 调试
		CONFIG_USB_C67X00_HCD						// Cypress公司的外设控制器
		CONFIG_USB_XHCI_HCD							// 重点:USB3.0驱动
			CONFIG_USB_XHCI_HCD_DEBUGGING			// 调试
			CONFIG_USB_XHCI_PLATFORM				// platform设备的xHCI驱动,仅用于嵌入式环境
		CONFIG_USB_EHCI_HCD							// USB2.0驱动
			CONFIG_USB_EHCI_ROOT_HUB_TT				// HUB适配,选Y以兼容usb1.1
			CONFIG_USB_EHCI_TT_NEWSCHED				// 改变工作方式,以提高多个USB1.1设备在USB2.0集线器上的速度
		CONFIG_USB_EHCI_HCD_PLATFORM				// platform设备的eHCI驱动,仅用于嵌入式环境
		CONFIG_USB_OHCI_HCD							// platform设备的oHCI驱动,仅用于嵌入式环境
		CONFIG_USB_UHCI_HCD							// platform设备的uHCI驱动,仅用于嵌入式环境
		CONFIG_USB_WHCI_HCD							// 无线USB主控接口
		CONFIG_USB_HWA_HCD							// 3G/4G无线上网卡。Host Wire Adapter driver
		CONFIG_USB_HCD_BCMA							// 博通对EHCI/OHCI的支持,仅用于嵌入式环境
		CONFIG_USB_HCD_SSB							// 博通对EHCI/OHCI的支持,仅用于嵌入式环境
		CONFIG_USB_MUSB_HDRC						// 基于Mentor Graphics公司silicon IP核的USB控制器,仅用于嵌入式环境
		CONFIG_USB_RENESAS_USBHS					// 基于Renesas公司USBHS IP核的USB控制器,仅用于嵌入式环境
		CONFIG_USB_ACM								// USB 适配器,modem,古董
		CONFIG_USB_PRINTER							// USB打印机
		CONFIG_USB_WDM								// 为CDC和WMC标准的手机提供设备支持
		CONFIG_USB_TMC								// Test and Measurement Class,适用于测试仪器的USB通信开发
		CONFIG_USB_STORAGE							// 存储设备
			CONFIG_USB_STORAGE_DEBUG				// 调试
		CONFIG_USB_MDC800							// 具体设备支持,古董
		CONFIG_USB_MICROTEK							// 具体设备支持,古董
	CONFIG_USB_DWC3								// 基于DesignWare USB3 IP核的USB3.0控制器(仅用于嵌入式环境)
	CONFIG_USB_CHIPIDEA							// 基于DesignWare USB3 IP核的USB3.0控制器(仅用于嵌入式环境,同DWC2)
	CONFIG_USB_USS720							// 某种转换设备,忽略
	CONFIG_USB_SERIAL							// USB串口转换支持
	CONFIG_USB_TEST								// 调试
	CONFIG_USB_ATM								// DSL modem,古董
	CONFIG_USB_PHY								// 底层信号转换(仅用于嵌入式环境)
	CONFIG_USB_GADGET							// 主/从设备支持的功能,是linux允许运行在外设中,如手机作为PC的大容量存储设备加载时

20. 实际配置

  1. 环境

QCA + IPQ601X + Linux4.4.60 + 32bit

  1. 编译配置
#
# Makefile for the kernel USB device drivers.
#

# Object files in subdirectories

obj-$(CONFIG_USB)		+= core/
obj-$(CONFIG_USB_SUPPORT)	+= phy/

obj-$(CONFIG_USB_DWC3)		+= dwc3/
obj-$(CONFIG_USB_DWC2)		+= dwc2/
obj-$(CONFIG_USB_ISP1760)	+= isp1760/

obj-$(CONFIG_USB_MON)		+= mon/

obj-$(CONFIG_PCI)		+= host/
obj-$(CONFIG_USB_EHCI_HCD)	+= host/
obj-$(CONFIG_USB_ISP116X_HCD)	+= host/
obj-$(CONFIG_USB_OHCI_HCD)	+= host/
obj-$(CONFIG_USB_UHCI_HCD)	+= host/
obj-$(CONFIG_USB_FHCI_HCD)	+= host/
obj-$(CONFIG_USB_XHCI_HCD)	+= host/
obj-$(CONFIG_USB_SL811_HCD)	+= host/
obj-$(CONFIG_USB_ISP1362_HCD)	+= host/
obj-$(CONFIG_USB_U132_HCD)	+= host/
obj-$(CONFIG_USB_R8A66597_HCD)	+= host/
obj-$(CONFIG_USB_HWA_HCD)	+= host/
obj-$(CONFIG_USB_IMX21_HCD)	+= host/
obj-$(CONFIG_USB_FSL_MPH_DR_OF)	+= host/
obj-$(CONFIG_USB_FOTG210_HCD)	+= host/
obj-$(CONFIG_USB_MAX3421_HCD)	+= host/

obj-$(CONFIG_USB_C67X00_HCD)	+= c67x00/

obj-$(CONFIG_USB_WUSB)		+= wusbcore/

obj-$(CONFIG_USB_ACM)		+= class/
obj-$(CONFIG_USB_PRINTER)	+= class/
obj-$(CONFIG_USB_WDM)		+= class/
obj-$(CONFIG_USB_TMC)		+= class/

obj-$(CONFIG_USB_STORAGE)	+= storage/
obj-$(CONFIG_USB)		+= storage/

obj-$(CONFIG_USB_MDC800)	+= image/
obj-$(CONFIG_USB_MICROTEK)	+= image/

obj-$(CONFIG_USB_SERIAL)	+= serial/

obj-$(CONFIG_USB)		+= misc/
obj-$(CONFIG_EARLY_PRINTK_DBGP)	+= early/

obj-$(CONFIG_USB_ATM)		+= atm/
obj-$(CONFIG_USB_SPEEDTOUCH)	+= atm/

obj-$(CONFIG_USB_MUSB_HDRC)	+= musb/
obj-$(CONFIG_USB_CHIPIDEA)	+= chipidea/
obj-$(CONFIG_USB_RENESAS_USBHS)	+= renesas_usbhs/
obj-$(CONFIG_USB_GADGET)	+= gadget/

obj-$(CONFIG_USB_COMMON)	+= common/

obj-$(CONFIG_USBIP_CORE)	+= usbip/

实际编译进内核的如下:

CONFIG_USB=m
CONFIG_USB_SUPPORT=y
CONFIG_USB_DWC3=m
CONFIG_PCI=y
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_XHCI_HCD=m
CONFIG_USB_PRINTER=m
CONFIG_USB_STORAGE=m
CONFIG_USB_GADGET=m
CONFIG_USB_COMMON=m
obj-m	+= core/
obj-y	+= phy/
obj-m	+= dwc3/
obj-y	+= host/
obj-m	+= class/
obj-m	+= storage/
obj-m	+= misc/
obj-m	+= gadget/
obj-m	+= common/
<think>我们正在讨论的是在Linux内核中启用或配置ADB驱动,以便Linux系统可以作为ADB设备(即模拟一个Android设备)被其他主机通过ADB连接。这通常用于开发或测试场景,例如当你在开发一个基于Linux的嵌入式设备,并希望它能够被Android开发工具识别为ADB设备。 根据引用[1],ADB驱动是计算机与Android设备通信的驱动程序集合。在Linux内核中,ADB设备功能是通过“USB Gadget”框架实现的。具体来说,我们需要配置Linux内核以支持“USB Function FS”(FunctionFS)和“Android Gadget”驱动,特别是ADB功能。 以下是详细步骤: 1. **配置Linux内核**: 首先,确保内核配置中启用了必要的选项。这通常包括: - `CONFIG_USB_CONFIGFS`:启用USB配置功能(ConfigFS支持)。 - `CONFIG_USB_CONFIGFS_F_FS`:启用FunctionFS(用户空间功能)。 - `CONFIG_USB_CONFIGFS_F_ACC`:如果需要Android配件协议(例如ADB),则启用。 - `CONFIG_USB_CONFIGFS_F_ADB`:这是ADB功能的具体配置。 在编译内核前,使用`make menuconfig`(或类似工具)进入配置菜单,找到相关选项并启用。路径通常位于: ``` Device Drivers ---> USB support ---> <*> USB Gadget Support ---> USB Peripheral Controller (选择你的硬件平台) USB Gadget Drivers (选择“Configurable”) <M> USB functions configurable through configfs (CONFIG_USB_CONFIGFS) [*] Function filesystem (FunctionFS) (CONFIG_USB_CONFIGFS_F_FS) [*] Android Gadget (CONFIG_USB_CONFIGFS_F_ACC, CONFIG_USB_CONFIGFS_F_ADB等) ``` 注意:具体选项名称可能因内核版本而异。较新的内核中,ADB功能可能直接包含在Android Gadget中。 2. **加载内核模块**: 编译并安装内核后,确保相关模块已加载。通常需要以下模块: - `libcomposite` - `usb_f_fs` - `usb_f_mass_storage`(如果需要存储功能) - `usb_f_adb` 使用`modprobe`加载这些模块: ```bash sudo modprobe libcomposite sudo modprobe usb_f_fs sudo modprobe usb_f_adb ``` 3. **配置ConfigFS**: ConfigFS是一个用户空间可配置的文件系统,用于配置USB功能。我们需要挂载ConfigFS(如果尚未挂载)并创建ADB功能的配置。 ```bash # 挂载configfs(如果未挂载) sudo mount -t configfs none /sys/kernel/config # 创建一个gadget实例 cd /sys/kernel/config/usb_gadget sudo mkdir mygadget cd mygadget # 设置供应商和产品ID(可以使用一些测试ID,例如0x18d1和0x4e26) echo 0x18d1 > idVendor echo 0x4e26 > idProduct # 创建配置 mkdir configs/c.1 # 创建ADB功能 mkdir functions/ffs.adb # 将ADB功能关联到配置 ln -s functions/ffs.adb configs/c.1 # 设置USB控制器(根据你的硬件,例如dwc2) echo "<你的USB控制器名称>" > UDC # 例如,树莓派Zero上通常是dwc2 # echo "dwc2" > UDC ``` 4. **启动FunctionFS**: 在配置好ConfigFS后,需要挂载FunctionFS并启动ADB守护进程。 ```bash # 创建挂载点 sudo mkdir /dev/usb-ffs/adb sudo mount -t functionfs adb /dev/usb-ffs/adb # 启动ADB守护进程(以root权限运行) sudo adbd & ``` 5. **验证**: 将设备通过USB连接到另一台计算机(如运行Windows或Linux的主机),并在主机上运行`adb devices`。如果一切正常,你的Linux设备应该出现在设备列表中。 **注意事项**: - 确保你的硬件支持USB设备模式(例如,USB OTG)。 - 如果遇到权限问题,可能需要调整udev规则或使用root权限运行adbd。 - 不同内核版本可能有差异,请参考内核文档(Documentation/usb/gadget_configfs.txt)。 引用[3]提到Linux驱动开发是“填空题”,这里我们正是按照内核提供的框架(USB Gadget ConfigFS)来填充配置。 以上步骤基于Linux内核的USB Gadget框架实现ADB设备功能。如果遇到问题,可以检查内核日志(`dmesg`)以获取更多信息。 相关问题: 1. 如何检查Linux内核是否支持USB Gadget ConfigFS? 2. 在Linux设备上运行adbd时出现权限错误怎么办? 3. 如何将Linux设备配置为同时支持ADB和MTP功能?</think>### 在Linux内核中启用ADB驱动支持 要使Linux系统作为ADB设备使用(即模拟Android设备被其他主机连接),需在内核层面配置USB Gadget驱动框架。以下是具体步骤: #### 1. **内核配置** 启用以下内核选项(通过`make menuconfig`): ```bash Device Drivers ---> USB support ---> <*> USB Gadget Support ---> <M> USB functions configurable through configfs <M> Function filesystem (FunctionFS) <M> Android Gadget Functions <*> Android ADB function # 核心ADB功能 <*> Dummy HCD (for testing) # 测试用虚拟控制器 ``` 编译并安装新内核: ```bash make -j$(nproc) && sudo make modules_install install ``` #### 2. **加载内核模块** ```bash sudo modprobe libcomposite # 复合设备支持 sudo modprobe usb_f_fs # FunctionFS sudo modprobe usb_f_adb # ADB功能模块 ``` #### 3. **配置USB Gadget** 创建ADB设备配置: ```bash sudo mkdir /sys/kernel/config/usb_gadget/g1 cd /sys/kernel/config/usb_gadget/g1 # 设置设备描述符 echo 0x18d1 > idVendor # Google Vendor ID echo 0x4EE2 > idProduct # ADB设备PID echo 0x0100 > bcdDevice # 设备版本 echo 0x0200 > bcdUSB # USB版本 # 创建配置 mkdir configs/c.1 echo 120 > configs/c.1/MaxPower # 启用ADB功能 mkdir functions/ffs.adb ln -s functions/ffs.adb configs/c.1/ ``` #### 4. **挂载FunctionFS** ```bash sudo mkdir /dev/usb-ffs/adb sudo mount -t functionfs adb /dev/usb-ffs/adb ``` #### 5. **启动ADB守护进程** ```bash sudo adbd & # 以root权限运行ADB守护进程 ``` #### 6. **启用USB控制器** ```bash # 查看可用控制器 ls /sys/class/udc/ # 启用控制器(例如dwc3) echo "dwc3.0.auto" > UDC ``` #### 7. **验证连接** 在另一台主机上执行: ```bash adb devices ``` 应显示类似输出: ```bash List of devices attached 0123456789ABCDEF device ``` #### 关键配置说明 1. **USB Vendor/Product ID** `0x18d1/0x4EE2`是标准ADB设备标识符[^1] 2. **FunctionFS** 提供用户空间与内核的通信通道[^3] 3. **ADB守护进程** 需保持后台运行以响应ADB命令 #### 常见问题排查 - **设备未识别**:检查`dmesg | grep udc`确认控制器状态 - **权限问题**:确保adbd以root运行,并检查`/dev/usb-ffs/adb`权限 - **功能缺失**:确认内核配置中`CONFIG_USB_CONFIGFS_F_ADB=y` > 此配置使Linux系统模拟Android设备行为,支持完整的ADB协议交互[^1][^3]。实际使用时需根据硬件调整USB控制器名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过得精彩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值