我有一个正在使用的USB设备,并且正在使用带有Google Chrome的WebUSB开发应用程序。
问题是,每当我将USB设备插入Linux计算机时,都必须手动运行sudo modprobe -r ftdi_sio
来卸载它。
我希望每当将设备插入计算机时就自动卸载它,而不必每次都手动键入它。
有关如何实施的任何想法?帮助将不胜感激
我有一个正在使用的USB设备,并且正在使用带有Google Chrome的WebUSB开发应用程序。
问题是,每当我将USB设备插入Linux计算机时,都必须手动运行sudo modprobe -r ftdi_sio
来卸载它。
我希望每当将设备插入计算机时就自动卸载它,而不必每次都手动键入它。
有关如何实施的任何想法?帮助将不胜感激
如果您已经拥有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",ACTION=="remove",RUN+=""
这意味着当插入具有供应商ID 0403
和产品ID 6010
的设备时,它将运行/sbin/rmmod ftdi_sio
,这将删除ftdi_sio
模块。第二条规则意味着拔掉插头后什么也不会运行。有关如何命名.rules
文件(例如99-mydevice.rules
)的更多信息,请参见[writing udev rules]
您必须用设备的供应商ID和产品ID替换0403
和6010
。插入USB设备后,可以通过在命令行上运行lsusb
来找到供应商ID和产品ID。格式为:
Bus xxx Device xxx: ID idVendor:idProduct ManufacturerName
在.rules
目录中创建或编辑/etc/udev/rules.d/
文件之后,请确保使用以下命令重新加载.rules
文件:
sudo udevadm control --reload
有关udev规则的更多参考:
,将命令放在/etc/rc.local中,然后重新启动。看看是否可行。或者,您可以找到如何将其他.ko配置为在系统启动期间自动加载。遵循同样的步骤使模块自动加载。
,一种选择是将ftdi_sio模块“列入黑名单”,以阻止其自动加载。为此,请创建以下文件:
/etc/modprobe.d/ftdi_sio-blacklist.conf
# This is a comment. Change it if you want.
blacklist ftdi_sio
,
正确的方法是创建一个udev规则,该规则在连接特定USB设备时触发。
创建一个文件/etc/udev/rules.d/99-usb-load.rules,并用USB设备的产品ID和供应商ID替换“ 7523”和“ 1a86”。
# 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",RUN+="/bin/sh -c '/bin/echo removed device >> /tmp/udev_file'"
# Actual rules
ACTION=="add",RUN+="/sbin/rmmod ftdi_sio"
ACTION=="remove",RUN+=""
重新启动udev守护程序
sudo /etc/init.d/udev restart
只要连接了具有匹配PID / VID的USB设备,就会执行添加规则,并且它将卸载模块ftdi_sio。前两个规则用于调试目的,它们在/ tmp / udev_file中写了一行,可以用来验证规则是否已触发。
,看起来USB设备是新设备,插入后就没有现有的驱动程序。您需要中断线和USB驱动程序代码来满足您的要求。您需要将设备注册到该驱动程序,并将驱动程序注册到USB总线。还需要编写适当的中断例程,以便在插入设备后立即调用它。这将使其按需运行!