Debian

用於訪問不在 Raspbian 下工作的 USB 感測器的 udev 規則(RPi 零 W)

  • September 14, 2019

我有一個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 文件,然後重新啟動。

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