我有一个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 文件,然后重新启动。