Usb

udev 規則不區分

  • January 24, 2017

我有一個 Neato XV-* 雷射雷達單元,與 Sparkfun FTDI 晶片和 Arduino Uno 連接。它們顯示為/dev/ttyUSB0/dev/ttyUSB1,不可預知地未賦值。

所以,我寫道/etc/udev/rules.d/80-arduinouno.rules

SUBSYSTEM=="tty",
ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86",
MODE="0666",
OWNER="pi", GROUP="pi",
SYMLINK+="arduinouno"

…和/etc/udev/rules.d/90-neatolidar.rules

SUBSYSTEM=="tty", ENV(ID_SERIAL_SHORT)=="AL01OTZS",
ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AL01OTZS",
MODE="0666", OWNER="pi", GROUP="pi",
SYMLINK+="neatolidar"

idProductidVendor取自第一行

udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idProduct

udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idVendor

分別與 的輸出交叉引用lsusbIS_SERIAL_SHORT取自輸出

udevadm info -q all -n /dev/ttyUSB0 | grep ID_SERIAL

或者

udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep {serial}

但是,雖然此命令適用於 FTDI/雷射雷達,但它只為 Arduino提供了一個ID_SERIAL,而不是一個。ID_SERIAL_SHORT

當我做 a sudo service udev restart,然後嘗試在監視時插入和拔出設備時watch 'ls -lah /dev | grep ">"',我看到符號連結出現在兩者 以及arduinouno最後插入的那個。也就是說,目前,我同時看到和。但是如果我拔掉並重新插入,兩者都會切換到那個。neatolidar``ttyUSB*``arduinouno -> ttyUSB1``neatolidar -> ttyUSB1``ttyUSB0

如何讓我的 udev 規則區分這兩個設備,並且僅在檢測到正確設備時觸發?

如果重要的話,這是在執行 Raspbian Jessie 的 Raspberry Pi 3 上。Arduino 直接連接到 RPi,而FTDI連接到便宜的黃色EagleTec 4 埠 USB 集線器

執行sudo udevadm control --log-priority=info,然後觀察 的輸出tail -f /var/log/syslog,我注意到一些錯誤。

Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 1,starting at character 17 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 2,starting at character 50 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 3,starting at character 12 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 4,starting at character 23 ('\n')

`Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: unknown key ‘ENV(ID_SERIAL_SHORT)’ in /etc/udev/rules.d/90-neatolidar.rules:1

Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid rule ‘/etc/udev/rules.d/90-neatolidar.rules:1’

Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid key/value pair in file /etc/udev/rules.d/90-neatolidar.rules on line 2,starting at character 77 (’\n’) Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid key/value pair in file /etc/udev/rules.d/90-neatolidar.rules on line 3,starting at character 36 (’\n’)`

由此推斷(1)我的ENV(ID_SERIAL_SHORT)規則不起作用,(2)我不應該有換行符。因此,我更改為以下單行 .rules 文件:

/etc/udev/rules.d/80-arduinouno.rules:

SUBSYSTEM=="tty", ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="arduinouno"

/etc/udev/rules.d/90-neatolidar.rules

SUBSYSTEM=="tty", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AL01OTZS", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="neatolidar"

重新啟動後(或者可能只是sudo service udev restart和/或sudo udevadm control --reload),這似乎有效。

我的聲譽似乎不夠高,無法發表評論。

另外:我使用以下 bash 腳本重新載入我的 udev 規則並重新觸發,因此我什至不需要拔下並重新插入設備:

#!/bin/bash

sudo udevadm control --reload-rules
sudo udevadm trigger

引用自:https://unix.stackexchange.com/questions/333627