我该如何抛弃对 rmmod ftdi_sio 的使用

使用场景描述 (是什么)

这篇记录主要针对如何在linux下更加简单的使用ftdi2xx的动态链接库.
在近期的工作中我需要频繁地使用FTDI的设备(ftdi232)进行SPI的读写操作. 每次在调用自己的程序之前都需要按照官方的建议执行以下操作:

lsmod | grep ftdi
rmmod ftdi_sio

在调试过程中拔插设备的操作十分常见, 以至于每天都要输入上述的命令无数次. 为了完成我当一个咸鱼的梦想, 我在今天花费了一些时间研究了一下, 如何从这段烦人的命令中寻获解脱.

既然拥有一个实现咸鱼化的伟大梦想, 我对解决方案有着以下要求:

  • 摆脱对rmmod的使用
  • 摆脱对sudo命令的使用
  • 我希望能在使用FTDI232芯片的同时, 不影响到其他设备的使用

需要着重说明, 最后一点是过往使用中的另一个痛点: 其实使用ftdi芯片的设备不在少数. 在我的工作环境中还有另外两种设备会使用到ftdi的芯片: 一个是xilinx artix 7 FPGA, 另一个是一条做工优秀和外面那些地摊货不一样的蓝色串口线.

每次需要同时使用ftdi232和其中一个设备时, rmmod ftdi_sio这条命令就十分的令人感到绝望. 系统中所有依赖于ftdi_sio驱动的其他驱动, 都会因为依赖不满足也无法工作.

解决方案 (怎么办)

话不多说, 其实已经说了很多, 亮方案.

新建一个叫85-unbind-ftdi.rules的文件. 这里我想补上一句, udev的规则不能分行真的很治愈强迫症:)

ACTION=="add", ATTRS{idVendor}=="0403", MODE:="666"
ACTION=="add", ATTRS{idVendor}=="0403", ATTR{interface}=="Single RS232-HS", RUN+="/bin/sh -c '/bin/echo $kernel > /sys/bus/usb/drivers/ftdi_sio/unbind'"

然后将文件按照需求放入目录/run/udev/rules.d或者/etc/udev/rules.d中. 为此我写了一个简陋的Makefile.

unbind_ftdi:
    mkdir -p /run/udev/rules.d
    cp 85-unbind-ftdi.rules /run/udev/rules.d/

unbind_ftdi_persisted:
    mkdir -p /etc/udev/rules.d
    cp 85-unbind-ftdi.rules /etc/udev/rules.d/

注: 上述文件运行于在ubuntu 18.04

所用知识点的汇总 (为什么)

接下来的内容是以备未来魔改之需而记录的知识点.┗|`O′|┛ 嗷~~

rules 文件解析

上面的文件85-unbind-ftdi.rules中的内容是一组udev的规则. 在设备发生某些行为的时候, 会根据相应的规则进行相应的匹配, 然后执行某些命令.

  • 上述规则主要生效于新增设备时.
  • 第一条规则是赋予文件666的权限, 让我免于遭受sudo的折磨.
  • 第二条规则是只筛选出我特别针对的设备, 然后执行unbind, 让我在梦幻中解决烦恼.

文件名的前缀85-表示规则的序列, 越大的序列越靠后执行, 99那岂不是更美滋滋, 但是我就不.

makefile 文件解析

udev的这套系统中, 相关文件可以存放在 /lib/udev, /etc/udev/run/udev 目录下.lib目录下存放的是操作系统所需要的规则; etc目录下存放的是后期加入的规则; run目录下存放的是runtime的规则. 所以如果想要持久化, 那就把写好的文件放到etc目录下, 如果只想要本次开机使用, 那就放到run目录下.

unbind命令

对于之前ftdi官方推荐的rmmod ftdi_sio, 我只能说这种做法十分的暴力, 其实使用unbind就足够了.
通过lsusb -t找到设备对应的节点, 然后执行echo ${dev_path} > /sys/bus/usb/drivers/ftdi_sio/unbind.
对应usb设备可以在/sys/bus/usb/devices目录下找到.

$ lsusb  -t
    # snip ...
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 1: Dev 10, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
    # snip ...
$ sudo sh -c "echo 3-1:1.0 > /sys/bus/usb/drivers/ftdi_sio/unbind"
$ lsusb  -t
    # snip ...
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 1: Dev 10, If 0, Class=Vendor Specific Class, Driver=, 480M
    # snip ...

udev 及 udev rule

我看了一圈, 关于udev rule最直观的教程就在本地. 可以通过man udev查看udev的介绍和规则的具体内容. 然后可以进入/lib/udev/rules.d目录下, 查阅系统自带的规则, 学习一下先进的科学与技术. 还有就是这个链接也十分的不错, 有介绍 udevadm 的使用.

上面的规则是怎么攒出来的

通过 udevadm info -a ${usb_sysfs_path} 查看每个设备的所有属性. 下面是我所使用设备s的部分属性.

  1. ftdi232
  looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0':
    KERNEL=="3-1:1.0"
    SUBSYSTEM=="usb"
    DRIVER=="ftdi_sio"
    ATTR{authorized}=="1"
    ATTR{bAlternateSetting}==" 0"
    ATTR{bInterfaceClass}=="ff"
    ATTR{bInterfaceNumber}=="00"
    ATTR{bInterfaceProtocol}=="ff"
    ATTR{bInterfaceSubClass}=="ff"
    ATTR{bNumEndpoints}=="02"
    ATTR{interface}=="Single RS232-HS"
    ATTR{supports_autosuspend}=="1"
    # snip
    # ...
  1. xilinx FPGA
  looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0':
    KERNEL=="3-1:1.0"
    SUBSYSTEM=="usb"
    DRIVER=="ftdi_sio"
    ATTR{authorized}=="1"
    ATTR{bAlternateSetting}==" 0"
    ATTR{bInterfaceClass}=="ff"
    ATTR{bInterfaceNumber}=="00"
    ATTR{bInterfaceProtocol}=="ff"
    ATTR{bInterfaceSubClass}=="ff"
    ATTR{bNumEndpoints}=="02"
    ATTR{interface}=="Digilent USB Device"
    ATTR{supports_autosuspend}=="1"
    # snip
    # ...
  1. UART
  looking at device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4:1.0':
    KERNEL=="1-1.2.4:1.0"
    SUBSYSTEM=="usb"
    DRIVER=="ftdi_sio"
    ATTR{authorized}=="1"
    ATTR{bAlternateSetting}==" 0"
    ATTR{bInterfaceClass}=="ff"
    ATTR{bInterfaceNumber}=="00"
    ATTR{bInterfaceProtocol}=="ff"
    ATTR{bInterfaceSubClass}=="ff"
    ATTR{bNumEndpoints}=="02"
    ATTR{interface}=="FT232R USB UART"
    ATTR{supports_autosuspend}=="1"
    # snip
    # ...

经过多方筛选, 最终ATTR{interface}获得桂冠作为筛选目标设备的属性. 在实际工作中, 任何可用于筛选的条件只要能满足需求都具备可行性.

其中规则内的$kernel变量即为属性KERNEL. 可以观察到, 在目前的情况下, 此属性恰好可以作为unbind的参数直接进行使用.

如何调试udev

在ubuntu 18.04 上, 直接添加规则就能实时生效, 不需要特别执行udevadm control --reload.
可以使用 udevadm test ${usb_sysfs_path} 偷偷地观察代码有没有被运行.

一些更新

  • bug: 在ubuntu 18.04环境下, udev的规则在(apt update)之后才能生效.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • ping 出现 dup! 解决方案: udev 详解 如果你使用Linux比较长时间了,那你就知道,在对待设备文件...
    小灰灰1999阅读 210评论 0 0
  • 转自,格式做了调整。 如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略。...
    mikeliuy阅读 7,591评论 0 1
  • 系统管理与维护命令 date date(选项)(参数) | 选项 | 说明 | | :-------- | ...
    蓓蓓的万能男友阅读 3,748评论 0 5
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,753评论 0 5
  • 自从学完了武老师专栏的解梦专题并看完了《梦知道答案》这本书,对梦有了深入的认识,了解梦往往是自己潜意识想法一种躲开...
    RawHeart心然阅读 234评论 0 1