O ID do fornecedor e o ID do produto determinam sozinho o driver usado para um dispositivo USB?

4

Digamos que eu tenha um dispositivo USB com um ID de fornecedor (VID) de 0123 e um ID de produto (PID) de abcd .

0123:abcd

De acordo com a USB.org , a atribuição do ID do produto depende inteiramente do fabricante.

Product IDs (PIDs) are assigned by each vendor as they see fit

Portanto, não há nada que impeça um fornecedor mal orientado de vender uma grande variedade de dispositivos USB, todos precisando de drivers diferentes e todos usando os mesmos IDs de produtos e fornecedores.

USB Device A (needs driver X) -> 0123:abcd
USB Device B (needs driver Y) -> 0123:abcd
USB Device C (needs driver Z) -> 0123:abcd

O USB.org reconhece que esse comportamento do fornecedor em potencial pode ser problemático.

Duplicate numbers may cause driver error

Em um caso em que os ids são reutilizados para cartões que precisam de drivers diferentes, há algo que o SO possa fazer para determinar o driver apropriado?

Existem outros campos apresentados pelo dispositivo USB que podem ser usados (ou são normalmente usados) para inferir o driver apropriado? Estou assumindo apenas o ID do fornecedor e o ID do produto para determinar isso.

Ou um sistema típico * nix pressupõe que exista um < - > um relacionamento entre 0123:abcd e o driver que deve ser usado, e tudo o que ele pode fazer é escolher o driver 1 que julgar apropriado?

Suponho que, se apenas o ID do fornecedor e o ID do produto forem usados normalmente, somente a intervenção manual do usuário no carregamento do driver adequado funcionará e que não há muito o que fazer além de ficar chateado com o fornecedor por fazer coisas confuso.

    
por Will Haley 13.09.2017 / 05:43

1 resposta

2

Existem algumas outras informações que podem ser usadas para selecionar um driver de dispositivo: um número de versão, a classe de dispositivo, subclasse e protocolo e a classe de interface, subclasse e protocolo. (Para o lado do driver no Linux, veja o USB_DEVICE macros . Você pode ter uma idéia da informação disponível por looling na saída de lsusb -v .)

Como você espera que ainda não seja suficiente, antes que um driver seja realmente registrado para um dispositivo, o kernel chama uma função de teste no driver. Essa função decide se o dispositivo é realmente suportado pelo driver. De modo geral, no Linux, dispositivos com o mesmo id, mas implementações diferentes, são manipulados pelo mesmo driver, o que evita ter que mapear vários drivers para um dispositivo. Para ver as exceções a essa regra, você pode executar

find /lib/modules/$(uname -r) -name \*.ko | xargs /sbin/modinfo | awk '/^filename:/ { filename = $2 } /^alias:/ { printf "%s %s\n", filename,$2 }' | sort | uniq -D -f 1 | uniq -u | less

que listará os poucos drivers que correspondem aos IDs conflitantes (nenhum deles é um driver de dispositivo USB).

(Eu vou expandir os dois tipos de comportamento mais tarde.)

    
por 13.09.2017 / 07:39