장치에 USB 드라이버를 할당하는 방법


30

이 질문은 두 가지입니다.

먼저 USB 장치에서 드라이버를 수동으로 분리하고 다른 장치를 어떻게 연결합니까? 예를 들어, 연결되면 자동으로 usb-storage 드라이버를 사용하는 장치가 있습니다.

usbview 출력

Vendor Id: xxxx
Product Id: xxxx
...
    Number of Interfaces: 2
    Interface Number: 0
        Name: usb-storage
        Number of Endpoints: 2
        ...
    Interface Number: 1
        Name: (none)
        Number of Endpoints: 2
        ...

usb-storage 드라이버를 사용하고 싶지 않으므로 내 응용 프로그램에서 libusb라이브러리를 사용 하여 usb-storage 드라이버를 분리 한 다음 인터페이스를 요구합니다. 그런 다음 USB 장치와 호스트 Linux 시스템에서 실행되는 응용 프로그램과 데이터를주고받을 수 있습니다.

응용 프로그램 외부에서 드라이버를 수동으로 어떻게 분리합니까?


둘째, 장치 플러그인에 연결할 드라이버를 자동으로 할당하는 방법은 무엇입니까? 현재 장치 권한을 자동으로 설정하는 udev 규칙 설정이 있습니다.

SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666"

udev 규칙을 사용하여 USB 장치의 특정 인터페이스에 드라이버를 할당 할 수 있습니까? 예를 들어, usb-storage 대신 인터페이스 0에서 usbnet 모듈을 자동으로 사용하려면 udev에서 가능합니까?


1
문제의 일부가 올바른 모듈을로드하는 경우 Angström의 웹캠
Gilles 'SO-stop

1
모든 USB 저장 모듈이 필요합니까? 그렇지 않으면 블랙리스트에 넣을 수 있고 전혀로드되지 않기 때문입니다.
Hanan N.

@Gilles, LKM을 성공적으로로드 할 수 있습니다. 내 질문은 어떻게 수동으로 자동으로 장치에 연결합니까?
linsek

@Hanan, 현재는 USB 저장 모듈을 사용하지 않습니다. 올바른 모듈을 자동으로 연결하기 위해 블랙리스트를 작성해야 할 수도 있지만 먼저 usbnet 모듈을 연결하는 방법을 알아야합니다.
linsek

1
@njozwiak 모듈 usbnet은 사용할 수있는 하드웨어에 대한 정보가 없기 때문에 자동으로로드되지 않습니다. 적절한 드라이버를 찾아서 사용하십시오 (예 :) modinfo kalmia. 에 alias선 당신은 공급 업체 ID XXXX 및 제품 ID YYYY를로 볼 수 있습니다 usb:vxxxxpyyyy. 또는 /lib/modules/kernel_version/modules.usbmap 파일을 편집 할 수 있으며 HW의 경우 줄을 삭제할 수 있습니다. HW 모듈의 USB 저장소 또는 올바른 net 드라이버로 usbstorage를 변경할 수 있습니다. 그러나이 depmod -a변화 후에 사라질 것입니다.
Jan Marek

답변:


20

질문의 첫 번째 부분에서, 나는 이미 libusb로하고있는 것보다 USB 드라이버를 분리하는 더 좋은 방법을 보았고 찾을 수 없었습니다.

질문의 두 번째 부분에서 udev는 드라이버 로딩에 반응 할 수 있지만 특정 드라이버를 장치에 강제 로 할당 할 수는 없습니다.

Linux 커널의 모든 드라이버는 하나 이상의 장치를 담당합니다. 드라이버 자체가 지원하는 장치를 선택합니다. 프로그래밍 방식으로, 즉 장치의 공급 업체와 제품 ID를 확인하거나, 구할 수없는 장치 (예 : 구 장치)가 있으면 자동 감지 휴리스틱 및 온 전성 검사를 수행합니다. 드라이버가 자신이 지원하는 장치를 찾으면 자신을 연결합니다. 간단히 말해 특정 드라이버가 특정 장치를 사용하도록 강요 할 수없는 경우가 많습니다. 그러나 때로는 장치 드라이버가 받아들이는 것에 관대하며 알 없는 장치 작동 할 수 있습니다 . 마일리지가 다를 수 있습니다! 과거에는 이상한 PCI 장치 / 공급 업체 ID를 지원해야하는 드라이버에 수동으로 추가해야했습니다.

이제 모듈의 경우 추가 단계가 있습니다. 새 장치가 감지되면 커널 이 모듈 로더 를 깨 웁니다. 장치를 식별하고 USB 장치에 대해 다음과 같이 보이는 'modalias'문자열이 전달됩니다.

usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00

이 문자열에는 장치 클래스 ( usb) 및 클래스 별 정보 (공급 업체 / 장치 / 일련 번호, 장치 클래스 등)가 포함됩니다. 각 커널 드라이버에는 다음과 같은 줄이 있습니다.

MODULE_ALIAS("usb:...")

usbalia와 일치해야합니다 (와일드 카드는 여러 장치를 일치시키는 데 사용됨). (가) 경우 modalias드라이버가 지원하는 하나와 일치,이 드라이버는로드 (또는 이미이 있다면, 새 장치의 통지).

지원되는 장치 (modalias 별) 및 관련 모듈을

less /lib/modules/`uname -r`/modules.alias

usb-storage 장치 드라이버를 grep하면 공급 업체 및 장치 ID에서 지원하는 특정 장치가 있으며 공급 업체 / 장치에 관계없이 올바른 (스토리지) 클래스의 장치를 지원하려고 시도합니다. .

OS ( /etc/modprobe.d/데비안 및 친구)의 사용자 공간 메커니즘을 사용하여이 영향을 줄 수 있습니다 . 모듈을 블랙리스트에 올리거나 modules.alias파일 처럼 (그리고 동일한 구문을 사용하여) 모 달리아가로드 할 모듈을 지정할 수 있습니다 . depmod -a모듈 로더의 패턴을 재생성합니다.

그러나이 특정 말을 물로 인도 할 수는 있지만 그를 마실 수는 없습니다. 드라이버가 장치를 지원하지 않으면 무시해야합니다.

이것이 일반적인 경우의 이론입니다.

실제로 USB의 경우 장치에 두 개의 인터페이스 가 있으며 그중 하나는 저장소입니다. 커널은 전체 장치 의 스토리지 인터페이스 에 연결됩니다 . 다른 인터페이스에 적합한 클래스가 있으면 usbnet드라이버 연결할 수 있습니다. 예, USB 장치는 여러 개의 인터페이스를 내보내 므로 동일한 물리적 장치에 여러 개의 드라이버를 연결할 수 있습니다 (예 : 키보드 장치와 LCD 화면이 있고 각각 별도의 드라이버로 처리되는 로지텍 G15 키보드는 두 개를 내 보냅니다) .

USB 장치의 두 번째 인터페이스가 감지되지 않는다는 사실은 커널에서 지원이 부족함을 나타냅니다. 어떤 경우이든을 사용하여 장치 인터페이스 / 끝점을 세부적으로 나열한 lsusb -v | less다음 특정 장치로 아래로 스크롤 할 수 있습니다 (경향이있는 경우 장치 : 공급 업체 ID 또는 USB 경로별로 출력을 제한 할 수 있음).

참고 : USB 장치의 논리적 구조와 관련하여 여기서 약간 단순화했습니다. USB 컨소시엄을 비난하십시오. :)


4
이미 static struct usb_device_id id_table [] = { { USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, { }, }; MODULE_DEVICE_TABLE (usb, id_table);코드에 있습니다. 모 달리아와 중복됩니까?
Thomas

필자의 경우 해당 라인은 드라이버의 어느 곳에서나 Makefile 마술에 의해 자동 생성됩니다. 그래서 MODULE_ALIAS에 대해 세 번 줄을 추가했지만 목록에 표시되지 않습니다. 어쨌든 lsusb -v에 감사드립니다. 그것으로 나는 그것을 확인하고 내 아이디어의 결함을 찾을 수 있습니다. 그런 다음 알려진 식별자의 소스를 grep하고 조작해야 할 항목이있는 배열을 찾았습니다.
JackGrinningCat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.