用于访问在 Raspbian(RPi 零 W)下不工作的 USB 传感器的 udev 规则

用于访问在 Raspbian(RPi 零 W)下不工作的 USB 传感器的 udev 规则

我有一个USB光传感器我已经在 Raspberry Pi 3 上使用了近一年,没有出现任何问题。我现在尝试在 Raspberry Pi Zero Wireless 上使用它。

我跟着传感器制造商的文档在 Pi Zero 上创建 udev 规则(与我在 Pi3 上的规则相同),以便授予“pi”用户使用 USB 设备的权限(因为我不想将其用作 root) :

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

此时我收到一条错误消息:

错误:无法注册 USB:用户没有足够的权限访问 USB 设备 (ypkt_lin:406)

如果我将相同的传感器插入 RPi3 并运行相同的命令,我会得到输出到终端的传感器序列号列表(此命令的预期输出)。

如果我以 root 身份运行命令(在 Pi Zero 上),即sudo ./bin/YModule 库存,则命令运行正确,并且输出是传感器的序列号(命令的预期输出)。

很明显存在许可问题。我只是不知道如何解决它。

我假设我的 udev 规则中的某个地方有错误,但我不知道哪里有错误,因为 Pi 0 上的规则文件与我的(工作)Pi 3 上的规则文件相同(与在制造商的网站上)。

lsusb 的输出:

总线 001 设备 002:ID 24e0:0050
总线 001 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器

第一个设备是 Yoctopuce 光传感器(24e0 绝对是正确的供应商 ID)。

输出须藤 lsusb -v -d 24e0:0050:

总线 001 设备 002:ID 24e0:0050

设备描述符:

b长度18

b描述符类型1

bcdUSB 2.00

bDeviceClass 0(在接口级别定义)

bDeviceSubClass 0

b设备协议0

bMaxPacketSize0 8

idVendor 0x24e0

产品 ID 0x0050

bcd设备 0.01

iManufacturer 1 Yoctopuce

iProduct 2 Yocto-Light-V3

iSerial 3 LIGHTMK3-1136C5

bNumConfigurations 1

配置描述符:

b长度9

b描述符类型2

w总长度 41

bNumInterfaces 1

b配置值1

i配置 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 零上):

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"

答案1

我刚刚通过将 /etc/udev/rules.d/51-yoctopuce.rules 中的两行放到预先存在的规则文件的末尾(位于 /etc/udev/rules.d/99-com.规则),然后我删除了 51-yoctopuce.rules 文件,然后重新启动。

相关内容