USB 커널은 드라이버를 LInux 커널의 특정 HCI와 어떻게 연결합니까?

USB 커널은 드라이버를 LInux 커널의 특정 HCI와 어떻게 연결합니까?

커널 소스 코드에 있는 기존 vhci_hcd를 기반으로 VHCI 드라이버를 작성하려고 합니다. 나의 초기 아이디어는 USB 코어에 의해 브리지된 VHCI 코드를 사용하기 위해 USB 드라이버를 작성하는 것이었습니다.

vhci_hcd 종료를 기반으로 VHCI 드라이버를 로드하고 "lsusb" 출력에서 ​​생성된 가상 허브를 볼 수 있으며 기본적으로 deviceID/productID는 USB 코어에 의해 생성되었습니다. 하지만 deviceID/productID를 기반으로 하는 VHCI에 USB 드라이버를 연결할 수 없습니다(ID가 일치하더라도 USB 드라이버에서 프로브() 기능을 실행할 수 없습니다).

이것이 예상되는 동작인지 아는 사람이 있습니까? USB 드라이버는 VHCI가 아닌 실제 HCI에만 연결할 수 있습니까?

답변1

예비 답변:

가정을 정리하고 문제를 명확히 할 수 있도록 노력해 보겠습니다.

sysfs 또는 ioctl을 통해 VHCI와 통신하는 사용자 공간 프로그램 대신 VHCI와 통신하는 USB 드라이버를 작성하고 싶습니다.

"USB 드라이버"란 정확히 무엇을 의미합니까? 특정 장치(예: USB 카메라)에 대한 커널 드라이버를 구현하시겠습니까? 이것은 "USB Gadget Driver"가 될 것이며 커널에는 이미 이러한 드라이버가 많이 있으므로 해당 코드를 살펴보십시오. 가젯 드라이버를 테스트하려는 경우 필요하며 dummy_hdc커널 가젯 드라이버가 나타내는 모든 장치를 포함하는 가상 루트 허브를 만듭니다.

VHCI 프로젝트는 다음과 같이 특별히 설계되었습니다.사용자 공간(가상) 장치용 USB 드라이버. "sysfs 또는 ioctl을 통해 통신하는 사용자 공간 프로그램"을 원하지 않는다면 VHCI는 잘못된 선택입니다.

내가 이해한 바로는 VHCI는 실제 하드웨어에 연결되는 OHCI/UHCI 코드와 유사합니다.

예, 루트 허브를 제공합니다. 지금까지는 비슷합니다.

USB 드라이버는 USB 코어, 궁극적으로 OHCI/UHCI, 그리고 하드웨어와 통신합니다.

당신은 나를 여기서 잃었습니다. 어떤 "USB 드라이버"에 대해 이야기하고 있습니까? 컴퓨터와 사용자가 (실제) USB 장치와 상호 작용할 수 있게 해주는 커널 드라이버를 의미합니까? 예를 들어 usb_storageUSB 대용량 저장 장치가 다음과 같이 표시됩니까 /dev/sd*? 이는 VHCI 사용자 공간 드라이버 또는 USB 가젯 커널 드라이버와 완전히 독립적입니다.

이러한 드라이버를 사용하려면 에뮬레이트된 USB 장치를 커널 가젯 드라이버로 제공하거나 dummy_hdcVHCI를 통해 사용자 공간 드라이버를 제공하여 실제 USB 버스에 해당 장치를 실제 USB 장치로 제공해야 합니다.

따라서 실제 질문이 "결국 실제 하드웨어가 되어야 하는 새로운 USB 장치가 있고 이에 대한 Linux 커널 드라이버를 작성하고 싶지만 먼저 테스트하고 싶습니다."라면 다음과 같습니다.드라이버: 하나는 개발하려는 커널 드라이버이고 다른 하나는 아직 존재하지 않는 장치를 에뮬레이트하는 가상 동반자입니다. 커널 공간(가젯 드라이버) 또는 사용자 공간(VHCI)에서 이 작업을 수행할 수 있습니다.

관련 정보