Parece que existe uma maneira de impedir que o sistema tente definir a configuração do dispositivo e até funciona a partir do espaço do usuário. Eu tropecei no commit que adicionou essa funcionalidade ao kernel e, por sorte, também inclui uma amostra código.
Os programas de espaço do usuário podem declarar a propriedade de uma porta específica de um hub USB por meio do sistema de arquivos do dispositivo, resultando em usb_device_is_owned()
retornando verdadeiro.
O truque parece ser:
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);
Informações sobre algumas solicitações do ioctl do subsistema USB estão descritas no documentação do kernel . A lista completa pode ser encontrada na fonte do kernel . As #defines são aqui .
Curiosamente, o sistema ainda envia Set Configuration Requests para as configurações 0 (reset configuration).