1

我对 linux 设备驱动程序非常陌生,目前正在研究 USB 驱动程序。我需要将与 USB 相关的驱动程序作为可加载模块并删除/重新插入它们。但是我遇到了一些问题。我正在开发基于 Qualcomm Snapdragon 820 处理器(APQ8096)的 Dragonboard 820。

Linux 内核版本:3.18.20

安卓版本:6.0

插入驱动程序第一次工作。这是插入的顺序。
insmod dbm.ko
insmod dbm-1_4.ko
insmod dbm-1_5.ko
insmod dwc3.ko
insmod dwc3-msm.ko
insmod dwc3-pci.ko

insmod ehci-hcd.ko
insmod ehci-pci.ko

insmod xhci-hcd.ko

insmod xhci-pci.ko
insmod xhci-plat-hcd.ko

insmod phy-msm-ssusb-qmp.ko
insmod phy-msm-qusb.ko

insmod usb-storage.ko

'lsmod' 给出以下输出;

root@msm8996:/system/lib/modules # lsmod Module Size Used by usb_storage 55391 0 phy_msm_qusb 18820 4 phy_msm_ssusb_qmp 17033 2 xhci_plat_hcd 6509 0 xhci_pci 4916 0 xhci_hcd 158558 2 xhci_plat_hcd,xhci_pci,[permanent] ehci_pci 4594 0 ehci_hcd 69125 1 ehci_pci dwc3_pci 2890 0 dwc3_msm 50671 0 dwc3 237561 1 dwc3_msm dbm_1_5 6526 0 dbm_1_4 6197 0 dbm 2119 3 dwc3_msm,dbm_1_5,dbm_1_4

插入后 USB 工作良好。但是,在尝试删除驱动程序时(以相反的顺序),三个驱动程序 -phy_msm_qusb、phy_msm_ssusb_qmp 和 xhci_hcd 没有被删除,并且重新插入其他驱动程序崩溃(重新插入 xhci_plat_hcd 时)。如果我强制删除这些驱动程序,它会非常不稳定,并且在删除剩余驱动程序或重新插入时崩溃。因此,如果有人对此有任何意见 - 非常感谢。

4

1 回答 1

0

xhci_hcd永久的,不能卸载modprobe

为什么这个内核模块在 2.6.39 上标记为永久

如果phy代表物理并且意味着 USB 主机控制器芯片使用的最低级别固件,也许它类似于phy_msm_ssusb_qmp并且phy_msm_qusb

这三个模块是不能更改的最低级别。也许问题在于由于依赖关系而重新插入其他模块的顺序。您的帖子中 lsmod 输出的“使用者”列表示 ie使用ehci_hcd的是ehci_pci 但是每个加载的模块都由系统上的(未知)进程使用,这就是您无法再卸载三个模块的原因(锁定按内核进程)

例如,在上面的示例输出中,iptable_filter 由一个(未知)Linux 进程使用,而 ip_tables 模块由一个名为 iptable_filter 的内核模块使用。来源:http: //xmodulo.com/how-to-check-kernel-module-dependencies-on-linux.html

也许您必须接受一旦加载它们就会留下来并根据依赖关系订购更改重新插入的顺序

另一种可能性是它们有问题,请参阅为什么这个内核模块在 2.6.39 上标记为永久

http://pritambankar.blogspot.de/2012/10/solution-to-problem-of-module-getting.html是永久标记模块的解决方案(使用-DCC_HAVE_ASM_GOTO标志重新编译)

于 2017-04-10T16:24:25.140 回答