我正在 Lubuntu 16.04.3 LTS 上使用 HIDAPI 製作一個自訂 USB HID 裝置以及一個與之配套的桌面應用程式。我們myapp
暫時就這樣稱呼它。
顯然,如果我這樣做$ ./myapp
,libusb_open()
就會失敗LIBUSB_ERROR_ACCESS
。 (在我的調試器中顯示為-3
;花了一段時間才弄清楚這一點,因為枚舉似乎沒有很好地記錄)
但如果我這樣做$ sudo ./myapp
,它就會成功。
我真的不想myapp
擁有 root 權限,那麼如果沒有 root 權限,我該如何與我的 USB 裝置通訊?
我希望得到答案這裡,但似乎就在此時被放棄了。它說了一些關於用戶權限的內容,但我似乎在我的系統上找不到它。我想我可能會找到一個名為usb
或的小組libusb
,我可以將自己加入其中,但沒有那麼幸運。
這個問題在另一個 SE 網站上有一個答案,使用一些嚴格的文本文件來全局更改權限(可能是一個壞主意)或特定設備的權限,但是:
- 這不是我要找的「麻瓜的調整」。
- 大多數這些文件都會發出警告,禁止直接修改,因為它們是自動產生的。那麼我如何確定隨機包更新不會消除我的更改並因此中斷
myapp
? - 無論如何,它似乎沒有做任何事情。我按照這些說明進行操作並重新啟動,並且
myapp
在用戶權限的情況下仍然無法與 USB 通訊。
答案1
這仍然不是我真正想要的“麻瓜的調整”,但至少這是有效的:
顯然 udev 有兩個目錄(我不知道為什麼):
/etc/udev/rules.d
/lib/udev/rules.d
我一直在搞亂/lib
這個,卻一事無成。我找到了/etc
那個這裡,而且它確實有效:
放SUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"
VID
是個USB-IF 指派的供應商 ID相關設備的*PID
是相關設備的供應商分配的產品 ID *0666
提供與此行匹配的任何內容的通用讀取/寫入存取權限*
$ lsusb
查看所有連接的 USB 裝置及其 ID。
在/etc/udev/rules.d/xx-my-rule.rules
(可能需要 root/sudo 權限)
xx
是大於 50 的任意數字(預設值為 50,數字越大優先)my-rule
隨便你怎麼稱呼它- 必須結束於
.rules
然後udevadm control --reload-rules
(可能還需要 root/sudo 權限),並且它應該「僅適用於」特定的 VID/PID 對。
另一個選擇是稍微收緊權限,即使用TAG+="uaccess"
代替MODE="0666"
.這限制了對當前登入(實體)使用者而不是所有使用者的存取。謝謝@Lekensteyn!
答案2
對於其他為此苦苦掙扎的人 - 我需要添加組=“plugdev”在 Ubuntu 18.04 下我的 udev 規則使其工作。
對於我的 BTD-400 適配器,該文件/etc/udev/rules.d/51-usb-device.rules內容如下:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="21e8", GROUP="plugdev", TAG+="uaccess"