캡처된 USB 트래픽을 기반으로 기존 USB 장치용 Linux 드라이버를 작성하려고 합니다.
이 장치는 다양한 구성으로 제공됩니다. 불행하게도 장치는 USB 사양을 따르지 않는 것 같습니다. 첫 번째 설정 구성 요청만 작동합니다. 두 번째 설정 구성을 요청하는 동안 장치가 잠기고 결국 충돌이 발생했습니다. USB 재설정 또는 구성 재설정(0으로 설정)도 도움이 되지 않았습니다.
이제 Linux USB 코어는 어떤 이유로 장치 구성을 잘못된 값으로 설정하기로 결정한 것 같습니다(첫 번째 값만 선택). 그렇게 하기 전에 내가 개입할 기회는 없습니다. 커널 모듈과 사용자 공간 libusb 드라이버에서 모두 시도했습니다.
usb_choose_configuration()
커널 소스 코드를 읽어보면 구성을 선택하는 함수가 일반 드라이버에 있는 것으로 보입니다./drivers/usb/core/generic.c. true를 반환하면 함수를 건너뛸 수 있다는 것을 알 수 있지만 usb_device_is_owned()
함수 결과에 어떤 영향을 미칠지는 모르겠습니다.
USB 드라이버를 추가하기 위해 전체 커널을 다시 컴파일할 필요가 없기를 바랍니다.
내 질문은 다음과 같습니다.
- 운전자에게 제어권을 넘기기 전에 시스템이 구성을 설정하지 못하도록 하려면 어떻게 해야 합니까?
- 최신 커널 버전에서는 usbcore가 내장 모듈이므로 교체할 수 없는 것 같습니다.
usb_choose_configuration
범용 드라이버(usbcore의 일부인 것으로 보임)의 기능을 재정의하는 다른 방법이 있습니까 ? usb_device_is_owned()
장치가 연결될 때 true를 반환 하도록 장치를 어떻게 가질 수 있습니까 ?
답변1
시스템이 장치의 구성을 설정하려고 시도하는 것을 방지하는 방법이 있는 것 같습니다. 사용자 공간에서도 작동합니다. 나는 그것을 우연히 발견했다이 기능을 커널에 추가하기로 약속, 다행히 여기에는 일부 샘플 코드도 포함되어 있습니다.
사용자 공간 프로그램은 usb_device_is_owned()
장치 파일 시스템을 통해 USB 허브의 특정 포트에 대한 소유권을 주장함으로써 true를 반환할 수 있습니다.
비결은 다음과 같습니다.
unsigned int port = 2; // Just as an example
// Send request 24 of type 'U' (USB), which returns an unsigned int
unsigned int ioctl_id = _IOR('U', 24, unsigned int);
// fd is a file descriptor to the hub's file in the devfs
ioctl(fd, ioctl_id, &port);
USB 하위 시스템에 대한 일부 ioctl 요청에 대한 정보는 다음 위치에 있습니다.커널 문서. 전체 목록은 다음에서 확인할 수 있습니다.커널 소스 코드. #정의는여기.
흥미롭게도 시스템은 여전히 구성 0(구성 재설정)에 대한 구성 설정 요청을 보냅니다.