OWPDK
USB-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선 어댑터를 독점하는 것을 방지할 수 있습니다. 다음 내용으로 파일을 만듭니다.onewire
libusb
/etc/modprobe.d/blacklist-1wire.conf
blacklist ds2490
그런 다음 modprobe -r ds2490
루트로 실행하거나 재부팅하십시오.