이 질문에는 두 가지 측면이 있습니다.
첫째, USB 장치에서 드라이버를 수동으로 분리하고 다른 드라이버를 연결하려면 어떻게 해야 합니까? 예를 들어, 연결되면 USB 저장소 드라이버를 자동으로 사용하는 장치가 있습니다.
USB 보기 출력
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 저장소 드라이버를 사용하고 싶지 않기 때문에 내 애플리케이션에서는 이 libusb
라이브러리를 사용하여 USB 저장소 드라이버를 분리한 다음 인터페이스를 선언합니다. 그런 다음 USB 장치와 호스트 Linux 시스템에서 실행되는 애플리케이션으로 데이터를 보낼 수 있습니다.
애플리케이션 외부에서 드라이버를 수동으로 분리하려면 어떻게 해야 합니까?
둘째, 장치 플러그인에 연결할 드라이버를 자동으로 할당하려면 어떻게 해야 합니까? 현재 장치 권한을 자동으로 설정하기 위한 udev 규칙 설정이 있습니다.
SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666"
udev 규칙을 사용하여 USB 장치의 특정 인터페이스에 드라이버를 할당할 수 있습니까? 예를 들어 인터페이스 0에서 usb-storage 대신 usbnet 모듈을 자동으로 사용하려는 경우 udev에서 이것이 가능합니까?
답변1
귀하의 질문의 첫 번째 부분에 대해서는 주변을 둘러보았지만 이미 libusb로 수행하고 있는 것보다 USB 드라이버를 분리하는 더 좋은 방법을 찾을 수 없습니다.
질문의 두 번째 부분에 관해서는 udev는 다음을 수행할 수 있습니다.반응드라이버가 로드되지만 로드되지 않음힘장치에 할당할 특정 드라이버입니다.
Linux 커널의 각 드라이버는 하나 이상의 장치를 담당합니다. 드라이버 자체가 지원하는 장치를 선택합니다. 프로그래밍 방식으로 이를 수행합니다. 즉, 장치의 공급업체 및 제품 ID를 확인하거나, 이를 사용할 수 없는 경우(예: 이전 장치의 경우) 일부 자동 감지 휴리스틱 및 온전성 검사를 수행합니다. 드라이버는 자신이 지원하는 장치를 찾았다고 확신하면 장치에 스스로 연결됩니다. 즉, 일반적으로 특정 드라이버가 특정 장치를 사용하도록 강제할 수는 없습니다. 그러나 때로는 장치 드라이버가 허용하는 내용에 대해 관대한 경우가 있습니다.할 수 있는직업을 모르는 거죠. 마일리지가 달라집니다! 과거에는 이상한 PCI 장치/공급업체 ID를 지원해야 하는 드라이버에 수동으로 추가해야 했는데 결과가 엇갈리고 흥미로운 커널 충돌이 발생했습니다.
이제 모듈의 경우 추가 단계가 있습니다. 이것모듈 로더새 장치가 감지되면 커널에 의해 깨어납니다. 장치를 식별하고 USB 장치의 경우 다음과 같은 "modalias" 문자열이 전달됩니다.
usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00
이 문자열에는 장치 클래스( usb
) 및 클래스별 정보(공급업체/장치/일련번호, 장치 클래스 등)가 포함됩니다. 각 커널 드라이버에는 한 줄이 포함되어 있습니다. 예를 들면 다음과 같습니다.
MODULE_ALIAS("usb:...")
usbalias와 일치해야 합니다(와일드카드는 여러 장치를 일치시키는 데 사용됩니다). modalias
드라이버가 지원하는 드라이버와 일치하면 드라이버가 로드됩니다(또는 이미 존재하는 경우 새 장치에 대한 알림) .
다음 명령을 사용하여 지원되는 장치(모드별) 및 관련 모듈을 볼 수 있습니다.
less /lib/modules/`uname -r`/modules.alias
USB 저장 장치 드라이버를 검색하면 공급업체 및 장치 ID에서 지원하는 일부 특정 장치가 있음을 알 수 있으며 공급업체/장치에 관계없이 올바른 (저장) 클래스가 있는 모든 장치를 지원하려고 시도합니다.
운영 체제(Debian 및 기타 버전)의 사용자 공간 메커니즘을 사용하여 /etc/modprobe.d/
이에 영향을 미칠 수 있습니다. 파일과 마찬가지로 modules.alias
(동일한 구문을 사용하여) 모듈을 블랙리스트에 추가하거나 모달리아로 로드할 모듈을 지정할 수 있습니다 . depmod -a
그러면 모듈 로더의 스키마가 다시 생성됩니다.
그러나 말을 물가에 데리고 갈 수는 있어도 물을 마시게 할 수는 없습니다. 드라이버가 장치를 지원하지 않으면 무시해야 합니다.
이것이 일반적인 이론이다.
실제로 USB 측면에서 귀하의 장치에는 두 개의 USB 포트가 있는 것 같습니다.상호 작용, 그 중 스토리지가 하나입니다. 코어는 저장소에 부착됩니다.상호 작용전체 장치의. 다른 인터페이스에 올바른 클래스가 있는 경우 usbnet
드라이버는할 수 있다그것에 붙어 있습니다. 예, 여러 드라이버를 동일한 드라이버에 연결할 수 있습니다물리적USB 장치는 여러 장치를 내보내기 때문에상호 작용(예를 들어 내 Logitech G15 키보드는 각각 별도의 드라이버로 처리되는 키보드 장치와 LCD 화면이 있기 때문에 두 개를 내보냅니다.)
USB 장치의 두 번째 인터페이스가 감지되지 않는다는 사실은 커널에서 지원이 부족함을 나타냅니다. 두 경우 모두 목록 장치 인터페이스/엔드포인트 세부 정보를 사용한 lsusb -v | less
다음 특정 장치까지 아래로 스크롤할 수 있습니다(원하는 경우 장치별로 출력을 제한할 수 있습니다: 공급업체 ID 또는 USB 경로).
참고: 여기서는 USB 장치의 논리적 구조를 지나치게 단순화하고 있습니다. USB Alliance를 비난하십시오. :)