如何在设备插入我的计算机时自动 运行 'sudo modprobe -r ftdi_sio'

How to automatically run 'sudo modprobe -r ftdi_sio' whenever the device is plugged into my computer

我有一个正在使用的 USB 设备,我正在开发一个使用 WebUSB 的应用程序 Google Chrome。 问题是每当我将 USB 设备插入我的 Linux 计算机时,我都必须手动 运行 sudo modprobe -r ftdi_sio 来卸载它。

我希望每当我将该设备插入计算机时自动卸载它,而不必每次都手动输入它。

关于如何实施的任何想法?非常感谢帮助

将命令放入 /etc/rc.local 并重新启动。看看它是否有效。或者您可以找到如何将其他 .ko 配置为在系统启动期间自动加载。按照相同的步骤使您的模块自动加载。

一个选项是 "blacklist" ftdi_sio 模块停止自动加载。为此,请创建以下文件:

/etc/modprobe.d/ftdi_sio-blacklist.conf

# This is a comment. Change it if you want.
blacklist ftdi_sio

正确的方法是创建一个在连接特定 USB 设备时触发的 udev 规则。

创建文件 /etc/udev/rules.d/99-usb-load.rules,并将“7523”和“1a86”替换为您的 USB 设备的产品 ID 和供应商 ID。

# For debugging if the rule is working
ACTION=="add", ENV{ID_MODEL_ID}=="7523", ENV{ID_VENDOR}=="1a86", RUN+="/bin/sh -c '/bin/echo inserted device >> /tmp/udev_file'"
ACTION=="remove", ENV{ID_MODEL_ID}=="7523", ENV{ID_VENDOR}=="1a86", RUN+="/bin/sh -c '/bin/echo removed device >> /tmp/udev_file'"

# Actual rules
ACTION=="add", ENV{ID_MODEL_ID}=="7523", ENV{ID_VENDOR}=="1a86", RUN+="/sbin/rmmod ftdi_sio"
ACTION=="remove", ENV{ID_MODEL_ID}=="7523", ENV{ID_VENDOR}=="1a86", RUN+=""

重启 udev 守护进程

sudo /etc/init.d/udev restart

只要连接了匹配 PID/VID 的 USB 设备,就会执行添加规则,并卸载模块 ftdi_sio。前两条规则用于调试目的,将一行写入 /tmp/udev_file 并可用于验证规则是否已被触发。

看起来 USB 设备是新的,插入后没有现有的驱动程序可以处理。您需要一个中断线和一个 USB 驱动程序代码来满足您的要求。您需要将您的设备注册到该驱动程序并将驱动程序注册到 USB 总线。还需要编写适当的中断例程,以便在您的设备插入时立即调用。这将使它按照您的意愿工作!!

如果您已经有 USB 设备的 .rules 文件,则将以下内容附加到 /etc/udev/rules.d/ 目录中的预先存在的文件中。否则,在 /etc/udev/rules.d/ 目录中创建一个包含以下内容的文件:

ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ACTION=="add", RUN+="/sbin/rmmod ftdi_sio"
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ACTION=="remove", RUN+=""

这意味着当插入具有 vendorID 0403 和产品 ID 6010 的设备时 运行s /sbin/rmmod ftdi_sio 移除 ftdi_sio 模块.第二条规则意味着拔掉电源时什么都不会 运行 。有关如何命名 .rules 文件(例如 99-mydevice.rules

的更多信息,请参阅 [writing udev rules]

您必须将 04036010 替换为您设备的供应商 ID 和产品 ID。插入 USB 设备后,可以在命令行中通过 运行ning lsusb 找到供应商 ID 和产品 ID。它将具有以下格式:

Bus xxx Device xxx: ID idVendor:idProduct ManufacturerName

/etc/udev/rules.d/ 目录中创建或编辑 .rules 文件后,务必使用以下命令重新加载 .rules 文件:

sudo udevadm control --reload

关于 udev 规则的一些进一步参考:

debian wiki

arch wiki

writing udev rules