序言:似乎有些用户不太喜欢这个问题,我不知道为什么。如果您认为这个问题值得反对,请考虑发表评论解释原因,以便我知道如何解决它。我需要一个解决方案来解决问题,如果需要,我非常愿意编辑我的问题。
我正在尝试将TP-Link UE200
USB 到以太网适配器与 Debian Buster(撰写本文时的最新稳定版本)结合使用。在正常操作下,该适配器在首次插入时显示为 USB CD-ROM 驱动器,并依靠其驱动程序将其切换到以太网模式。
当我将适配器插入已经运行的系统时,该适配器工作正常:linux 正确检测到适配器并自动将设备切换到正确的模式。但是,当系统启动期间插入适配器时,我的系统无法自动切换正确的模式。
此外,当处于 CD-ROM 状态时,我无法找到一种方法来强制设备将自身显示为以太网适配器,而无需机械地拔出并重新插入设备。该系统旨在无需人工干预即可运行和重新启动,因此每次都必须手动干预是不可取的。
我的问题如下:如何让我的适配器(在系统启动时插入)将其自身显示为以太网适配器,而无需物理拔掉它?
旁注:
我想补充一点,我在树莓派 4 + Ubuntu 19.10 上运行了类似的设置。即使系统在插入以太网适配器的情况下启动,以太网适配器也能被正确识别。到目前为止,我只在 Debian Buster/x86_64 上遇到过这个问题。
就 USB 而言,适配器充当两个独立的 USB 设备。设备的两种模式中的每一种都有自己的 USB 产品 ID(即,作为 CD-ROM 驱动器运行时为 0601,作为以太网适配器运行时为 0602)。
到目前为止我尝试过的事情:
通过以下方式解除绑定和重新绑定设备
/sys/bus/usb/drivers/usb/{unbind,bind}
:适配器再次呈现自身0601
,内核再次将其注册为 CD-ROM 设备。我认为设备需要完全关闭电源才能正确重新初始化。usb-storage
手动从设备上解除驱动程序绑定,并cdc_ether
通过/sys/bus/usb/drivers/usb-storage/unbind
and绑定驱动程序/sys/bus/usb/drivers/cdc_ether/bind
(手动加载模块后):毫不奇怪,这不起作用,因为设备将自身作为 USB 大容量存储设备呈现给内核。用于
usb_modeswitch
手动强制设备将自身显示为 0602:设备只是忽略消息或拒绝工作。弹出设备-K
并重置它-R
似乎没有任何效果。通过以下方式断开设备连接
/sys/bus/usb/devices/XXX/remove
:工作完美,但没有办法让 linux 在不物理重新插入设备的情况下“取消删除”设备经过进一步调查,可能不会,因为 linux 不会切断设备的电源。将模块包含
cdc_ether
在我的 initramfs 中,并通过内核命令行参数预加载模块,modules_load
徒劳地希望这个问题是由于早期启动时缺少内核模块引起的:Linux 仍然使用usb-storage
。
答案1
安装usb-modeswitch
:
sudo apt install usb-modeswitch
使用 获取设备 ID lsusb
。例子:
Bus 001 Device 004: ID 2357:0601 TP-Link UE300 10/100/1000 LAN (ethernet mode) [Realtek RTL8153]
运行命令:
/usr/sbin/usb_modeswitch -v 2357 -p 0600 -R
而且它是固定的。我创建了在启动时执行此操作的服务。
这也适用于 TP-Link UE300
答案2
[很抱歉写了一个比评论更有价值的答案。如果某个模组可以转置,我将不胜感激。]
您的 BIOS 是否有可能将您的适配器作为可启动 USB 设备并锁定相关中断和 io 端口的处理,以便内核无法重新占用它?如果是这种情况,只需将 USB 设备强制从可启动设备列表中删除,并确保 BIOS 已配置为 PnP 系统即可。