udev 규칙을 사용하여 libusb 액세스 권한을 부여할 수 없습니다.

udev 규칙을 사용하여 libusb 액세스 권한을 부여할 수 없습니다.

OWPDKUSB-1-와이어 어댑터(DS2490 USB-1-와이어 브리지 칩 기반 DS9490R)에 대한 (1-와이어 라이브러리) 액세스를 얻으려고 합니다 .

이 라이브러리는 libusb를 사용하여 장치를 열거합니다(각 버스 사용 usb_get_busses및 탐색 bus->devices). 그런 다음 공급업체 및 제품 ID(저는 하나만 삽입했습니다)와 일치하는 첫 번째 장치를 가져와 호출 usb_open한 다음 usb_set_configuration반환된 핸들을 호출합니다.

내 Debian 10 시스템에서 이 프로그램을 루트로 실행하면 제대로 실행됩니다.

그런데 이 USB 장치에만 접근할 수 있는 onewire그룹의 사용자로 프로그램을 실행 하고 싶습니다.onewire

그래서 저는 /etc/udev/rules.d/90-onewire.rules다음 줄을 포함하는 파일을 만들었습니다.

SUBSYSTEMS=="usb", ATTRS{vendor}=="04fa", GROUP="onewire", MODE="0660"

그런 다음 규칙을 다시 로드합니다.sudo udevadm control --reload

usb_open이 사용자에게 적용 가능 하지만 usb_set_configuration적용할 수 없습니다(0이 아닌 결과를 반환함).

나는 (S 없이), ATTRS 조건 제거 등과 같은 규칙에서 다양한 조합을 시도했지만 SUBSYSTEM성공하지 못했습니다. 내가 무엇을 놓치고 있나요?

답변1

매뉴얼 usb_set_configuration(3)페이지설명하다:

int libusb_set_configuration(libusb_device_handle *devh, int config)

devh에 포함된 장치의 활성 구성을 config로 설정합니다. 이 함수는 성공하면 0을 반환하고, 요청한 구성이 존재하지 않으면 LIBUSB_ERROR_NOT_FOUND를, 인터페이스가 현재 선언된 경우 LIBUSB_ERROR_BUSY를, 장치 연결이 끊어진 경우 LIBUSB_ERROR_NO_DEVICE를, 실패하면 LIBUSB_ERROR 코드를 반환합니다.

그렇다면 0이 아닌 결과는 무엇입니까?

어댑터에 커널 드라이버가 있으면 LIBUSB_ERROR_BUSY.

이 경우 사용자(또는 라이브러리)가 먼저 이를 분리해야 합니다. 라이브러리는 설정된 경우 libusb_set_auto_detach_kernel_driver(handle, 1)(아마도 기본값) 이 작업을 자동으로 수행할 수 있지만 이를 성공적으로 수행하려면 루트 권한이 필요할 수 있습니다.

사용자가 1선 어댑터에 액세스할 수 있도록 하려면 ds2490커널 모듈을 블랙리스트에 추가하여 1선 어댑터를 독점하는 것을 방지할 수 있습니다. 다음 내용으로 파일을 만듭니다.onewirelibusb/etc/modprobe.d/blacklist-1wire.conf

blacklist ds2490

그런 다음 modprobe -r ds2490루트로 실행하거나 재부팅하십시오.

관련 정보