用於訪問不在 Raspbian 下工作的 USB 感測器的 udev 規則(RPi 零 W)
我有一個USB 光感測器,我在 Raspberry Pi 3 上使用了將近一年,沒有任何問題。我現在正嘗試在 Raspberry Pi Zero Wireless 上使用它。
我按照感測器製造商的文件在 Pi Zero 上創建了一個 udev 規則(這與我在 Pi3 上的規則相同),以便授予“pi”使用者使用 USB 設備的權限(因為我不想要將其用作根):
sudo nano /etc/udev/rules.d/51-yoctopuce.rules
將以下行添加到文件中:
# udev rules to allow write access to all users for Yoctopuce USB devices SUBSYSTEM=="usb", ATTR{idVendor}=="24e0", MODE="0666"
我重新啟動,然後執行製造商的命令以使用感測器:
YModule inventory
正是在這一點上,我收到一條錯誤消息:
ERR:無法註冊usb:使用者沒有足夠的權限訪問USB設備(ypkt_lin:406)
如果我將相同的感測器插入我的 RPi3 並執行相同的命令,我將獲得輸出到終端的感測器序列號列表(此命令的預期輸出)。
如果我以 root 身份執行命令(在 Pi Zero 上),即sudo ./bin/YModule inventory,那麼命令執行正確,輸出是感測器的序列號(命令的預期輸出)。
很明顯,有一個許可問題在起作用。我只是不知道如何解決它。
我假設我的 udev 規則中某處有錯誤,但我不知道在哪裡,因為 Pi Zero 上的規則文件與我的(工作)Pi 3 上的規則文件相同(與在製造商的網站上)。
lsusb的輸出:
匯流排 001 設備 002:ID 24e0:0050
匯流排 001 設備 001:ID 1d6b:0002 Linux Foundation 2.0 根集線器
第一個設備是 Yoctopuce 光感測器(24e0 絕對是正確的供應商 ID)。
sudo lsusb -v -d 24e0:0050的輸出:
匯流排 001 設備 002:ID 24e0:0050
設備描述符:
b長度 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0(在介面級別定義)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x24e0
idProduct 0x0050
bcdDevice 0.01
iManufacturer 1 Yoctopuce
iProduct 2 Yocto-Light-V3
iSerial 3 LIGHTMK3-1136C5
bNumConfigurations 1
配置描述符:
b長度 9
bDescriptorType 2
w總長度 41
bNumInterfaces 1
b配置值 1
配置 0
bm屬性 0x80
(Bus Powered)
最大功率 100mA
介面描述符:
bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.11 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 29 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1
設備狀態:0x0000
(匯流排供電)
我的目錄 /etc/udev/rules.d/ 的內容是: 51-yoctopuce.rules 99-com.rules
我還嘗試將其重命名為 100-yoctopuce.rules,以防 99-com.rules 文件中的某些內容導致問題,但這會導致相同的錯誤。
我的理解是,在編輯規則文件後,我所要做的就是重新啟動系統。這是對的,還是我缺少一些命令?
請就如何解決此問題提供任何建議?提前致謝。
文件 /etc/udev/rules.d/99-com.rules 的內容(在 Pi Zero 上):
SUBSYSTEM=="input", GROUP="input", MODE="0660" SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660" SUBSYSTEM=="spidev", GROUP="spi", MODE="0660" SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660" SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\ chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\ chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\ chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\ '" KERNEL=="ttyAMA[01]", PROGRAM="/bin/sh -c '\ ALIASES=/proc/device-tree/aliases; \ if cmp -s $ALIASES/uart0 $ALIASES/serial0; then \ echo 0;\ elif cmp -s $ALIASES/uart0 $ALIASES/serial1; then \ echo 1; \ else \ exit 1; \ fi\ '", SYMLINK+="serial%c" KERNEL=="ttyS0", PROGRAM="/bin/sh -c '\ ALIASES=/proc/device-tree/aliases; \ if cmp -s $ALIASES/uart1 $ALIASES/serial0; then \ echo 0; \ elif cmp -s $ALIASES/uart1 $ALIASES/serial1; then \ echo 1; \ else \ exit 1; \ fi \ '", SYMLINK+="serial%c"
我剛剛通過將 /etc/udev/rules.d/51-yoctopuce.rules 中的兩行放在預先存在的規則文件(位於 /etc/udev/rules.d/99-com.規則),然後我刪除了 51-yoctopuce.rules 文件,然後重新啟動。