Драйвер USB вылетает при повторной вставке

Я очень новичок в драйверах устройств Linux и в настоящее время работаю над драйвером USB. Мне нужно сделать драйверы, связанные с USB, в виде загружаемых модулей и удалить / повторно вставить их по желанию. Но я столкнулся с некоторыми проблемами. Я работаю над Dragonboard 820 на базе процессора Qualcomm Snapdragon 820 (APQ8096).

Версия ядра 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). Если я принудительно удаляю эти драйверы, это очень нестабильно и дает сбой либо при удалении оставшихся драйверов, либо при повторной установке. Так что, если у кого-то есть какие-либо предложения по этому поводу - это очень ценится.


person Jay    schedule 10.04.2017    source источник


Ответы (1)


xhci_hcd является постоянным и не может быть выгружен с помощью modprobe

Почему этот модуль ядра помечен как постоянный 2.6.39

возможно, это похоже на phy_msm_ssusb_qmp и phy_msm_qusb, если phy означает физический и означает прошивку самого низкого уровня, используемую микросхемами хост-контроллера 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

возможно, вам придется принять, что после загрузки они остаются, и заказать изменение порядка повторной вставки в соответствии с зависимостями

другая возможность заключается в том, что они содержат ошибки, см. случай в Почему этот модуль ядра помечен как постоянный в версии 2.6.39

в http://pritambankar.blogspot.de/2012/10/solution-to-problem-of-module-getting.html — это решение для постоянно помеченных модулей (перекомпилировать с использованием флага -DCC_HAVE_ASM_GOTO)

person ralf htp    schedule 10.04.2017
comment
Спасибо за ответ Ральф. xhci_hcd показан постоянным, поскольку в нем отсутствует функция выхода. Если вы добавите один, он больше не будет отображаться постоянно, и вы можете удалить его. Что касается двух других, вы правы, они используются какими-то неизвестными процессами. Мне сообщили, что эти драйверы не предназначены для компиляции в виде загружаемых модулей, и поэтому я отказался от этого подхода. - person Jay; 20.04.2017