我试图了解设备如何在 Linux 中通过 USB 进行通信,特别是移动 Android 设备,这样我就可以通过 USB 将 DIY 项目连接到我的手机。经过一番搜索后,我只找到了一些针对某些设备的 USB 驱动程序的一般解释。
我想知道一些事情:
- 如何找到连接到移动设备的特定设备使用的驱动程序?我在哪里可以找到它的代码?
- USB 堆栈是什么样子的?找不到好的文档。
- 如何开发 USB 设备的驱动程序? (同样适用于安卓)
- 如何将这些驱动程序嵌入到内核中或将它们动态加载到我的手机上?
谢谢
答案1
部分答案:USB 驱动程序通常是通过查看供应商/设备 ID 和嵌入模块中的其他模式为特定 USB 设备加载的内核模块。您可以使用以下命令找到现有驱动程序的此信息modinfo
,例如
$ sudo modinfo usbhid
filename: /lib/modules/4.12.13/kernel/drivers/hid/usbhid/usbhid.ko
license: GPL
description: USB HID core driver
author: Jiri Kosina
author: Vojtech Pavlik
author: Andreas Gal
alias: usb:v*p*d*dc*dsc*dp*ic03isc*ip*in*
depends: hid,usbcore
intree: Y
vermagic: 4.12.13 SMP preempt mod_unload modversions 686
parm: mousepoll:Polling interval of mice (uint)
parm: jspoll:Polling interval of joysticks (uint)
parm: ignoreled:Autosuspend with active leds (uint)
parm: quirks:Add/modify USB HID quirks by specifying
quirks=vendorID:productID:quirks where vendorID, productID, and quirks are all in 0x-prefixed hex (array of charp)
还有各种工具可以显示现有设备正在使用哪个驱动程序。我相信这些最终都会使用来自层次结构的信息/sys
。
所以如果你想写一个新的驱动程序,你需要学习如何编写内核模块(google,有教程)。选择一个现有的驱动程序并对其进行修改。
您还可以使用类似的库在用户空间中编写“驱动程序”(或更确切地说应用程序)libusb。
内核文档还包含有关USB接口,以及 USB 堆栈如何工作的信息。