如何在设备插入我的计算机时自动 运行 '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]
您必须将 0403
和 6010
替换为您设备的供应商 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 规则的一些进一步参考:
我有一个正在使用的 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
)
您必须将 0403
和 6010
替换为您设备的供应商 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 规则的一些进一步参考: