我是linux设备驱动程序的新手,目前正在研究USB驱动程序。我需要将USB相关驱动程序作为可加载模块,并随意删除/重新插入它们。但是我遇到了一些问题。我正在使用基于Qualcomm Snapdragon 820处理器(APQ8096)的Dragonboard 820。
Linux内核版本:3.18.20
Android版本: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) 。如果我强行删除这些驱动程序,它会非常不稳定,并且在删除剩余驱动程序或重新插入时崩溃。 所以,如果有人对此有任何意见 - 这是非常感谢。
答案 0 :(得分:0)
xhci_hcd
永久,无法使用modprobe
Why is this kernel module marked at permanent on 2.6.39
如果 phy 代表 physical ,则可能与phy_msm_ssusb_qmp
和phy_msm_qusb
相似,并且意味着USB主机使用的最低级别固件控制器芯片
这三个模块是无法改变的最低级别。也许问题是由于依赖性而重新插入其他模块的顺序。 '使用' 帖子中lsmod输出的列表示ehci_hcd
使用了ehci_pci
但是,每个加载的模块都由系统上的(未知)进程使用,这就是为什么你不能再卸载这三个模块(由内核进程锁定)
例如,在上面的示例输出中,iptable_filter由一个使用 (未知)Linux进程,而ip_tables模块由一个内核使用 模块名为iptable_filter。 来源:http://xmodulo.com/how-to-check-kernel-module-dependencies-on-linux.html
也许你必须接受,一旦加载它们就会停留并根据依赖关系命令更改重新插入的顺序
另一种可能性是它们有问题,请参阅Why is this kernel module marked at permanent on 2.6.39
中的案例 http://pritambankar.blogspot.de/2012/10/solution-to-problem-of-module-getting.html中的是永久标记模块的解决方案(使用-DCC_HAVE_ASM_GOTO
标志重新编译)