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.)