Como o núcleo USB associa o driver a um HCI específico no kernel do LInux?

1

Eu estou tentando escrever um driver VHCI que é baseado no vhci_hcd existente na origem do kernel. Meu pensamento original era escrever um driver USB para consumir o código VHCI, que é preenchido pelo núcleo USB.

Consegui carregar o driver VHCI (baseado na saída do vhci_hcd) e vi os hubs virtuais criados a partir da saída do 'lsusb' e, por padrão, o deviceID / productID já foi criado pelo núcleo do USB. No entanto, não consigo conectar meu driver USB ao VHCI com base no deviceID / productID (não é possível acionar a função probe () no driver USB, embora as IDs estejam correspondentes).

Alguém sabe se isso é um comportamento esperado? O driver USB só se conecta ao HCI real, mas não ao VHCI?

    
por luke 23.09.2018 / 06:23

1 resposta

0

Resposta preliminar:

Vamos tentar resolver as suposições, talvez possamos esclarecer as coisas.

I want to write a USB driver to talk to VHCI instead of user-space program that talk to it by sysfs or ioctl)

O que exatamente você quer dizer com "driver USB"? Um driver de kernel que implementa um dispositivo específico, como uma câmera USB? Isso seria um "driver de dispositivo USB", e o kernel já tem um bom número deles, então olhe para o código deles. Se você quiser testar os drivers de gadgets, precisará de dummy_hdc , que cria um hub raiz virtual que conterá todos os dispositivos representados pelos drivers de gadget do kernel.

O projeto VHCI é feito especificamente para permitir drivers USB de espaço de usuário para dispositivos (virtuais). Se você não quiser "um programa de espaço de usuário que converse com ele por sysfs ou ioctl", o VHCI é a escolha errada.

According to my understanding VHCI is similar to OHCI/UHCI code which are connected to real hardware.

Sim, ele fornece um hub raiz; na medida em que é semelhante.

And USB drivers talk to USB core which eventually talk to OHCI/UHCI then to the hardware

Você me perdeu aqui. Quais "drivers USB" você está falando? Você quer dizer drivers de kernel que permitem que o computador e o usuário interajam com dispositivos USB (reais)? Como, por exemplo usb_storage , o que torna os dispositivos de armazenamento em massa USB visíveis como /dev/sd* etc.? Eles são completamente independentes dos drivers de espaço do usuário VHCI ou drivers de kernel de gadgets USB.

Para poder usar esses drivers, você deve fornecer seus correspondentes na forma de um dispositivo USB real em um barramento USB real, ou um dispositivo USB simulado como um driver de gadget de kernel via dummy_hdc ou um espaço de usuário motorista via VHCI.

Portanto, se o seu verdadeiro problema é: "Eu tenho este novo dispositivo USB, que eventualmente deve ser hardware real, e eu quero escrever um driver de kernel Linux para ele, mas primeiro eu quero testá-lo." Então você precisa de dois drivers: um é o driver do kernel que você quer desenvolver, o outro é uma virtual counterpart que simula o dispositivo ainda não existente. Você pode fazer isso no espaço do kernel (driver do gadget) ou no espaço do usuário (VHCI).

    
por 23.09.2018 / 08:18