2009-06-12 17 views
7

¿Conoces una forma de usar la API de Windows XP para restablecer el bus USB? En otras palabras, me gustaría que el SO apague todos los dispositivos USB que estén actualmente conectados, y luego detecte automáticamente todo de nuevo.¿Cómo reinicio los dispositivos USB usando la API de Windows?

Conozco devcon, y supongo que podría hacer llamadas al sistema, pero espero una llamada directa a la API.

Respuesta

2

Bueno, utilice la API de configuración (funciones SetupDiXXX) para enumerar los dispositivos USB en el sistema, y ​​luego llame a WinUsb_ResetPipe en cada uno, pero no estoy seguro de si eso es lo que está buscando. Ha pasado un tiempo desde que trabajé con dispositivos USB, pero según recuerdo, no hay una forma estándar de restablecer un dispositivo (es decir, simular un ciclo de apagado/encendido). Si es posible para un dispositivo en particular, deberá enviar un IOCTL apropiado (usando DeviceIOControl) al controlador. El IOCTL variaría de un fabricante a otro.

0

Por lo que yo sé, no hay forma de hacerlo: puede emitir un comando para que PnP vuelva a explorar el bus para nuevos dispositivos, pero eso no es lo mismo que emitir un restablecimiento de bus.

Además, el hecho de que desde el punto de vista del hardware haya emitido un reinicio de bus no significa que Windows eliminará los PDO que representan los elementos secundarios del concentrador y los volverá a detectar; el controlador del bus USB puede (y hace) hacer lo que describo (es decir, reiniciar el bus de hardware sin perturbar el árbol del dispositivo) y solo después de el dispositivo no responde, emite la eliminación sorpresa y lo arranca del árbol .

10

De modo kernel: Usted puede forzar al dispositivo USB específico que se vuelva a conectar, como si fuera desenchufado y Replugged de nuevo, enviando un IOCTL_INTERNAL_USB_CYCLE_PORT a su denominación de origen. (Esto solo se puede hacer desde un modo kernel, por ejemplo, a través de un controlador auxiliar.) Esta operación 'ciclo' causará que se produzca un reinicio USB, después de lo cual el dispositivo se volverá a enumerar. Por ejemplo, si el dispositivo vuelve con un descriptor de dispositivo USB diferente, se puede combinar un controlador diferente para él.

Desde el modo de usuario: Puede hacerlo expulsando el dispositivo a través de la API de CfgMgr. Por ejemplo, para revisar todos los concentradores USB y expulsar todos los dispositivos:

  1. Buscar Todos los dispositivos que tienen interfaz de dispositivo GUID_DEVINTERFACE_USB_HUB con SetupDiGetClassDevs(... DIGCF_DEVICEINTERFACE).
  2. Enumerar sobre el conjunto de información de dispositivo devuelto (SetupDiEnumDeviceInfo).
  3. Para cada dispositivo, obtener el DevInst miembro:
    1. Invoke CM_Get_Child(DevInst) y luego CM_Get_Sibling repetidamente para repasar todos los nodos hijos del cubo (es decir, los dispositivos de USB).
    2. Para cada nodo secundario, llame al CM_Request_Device_Eject.
2

Es posible ciclo de puerto de los padres en el concentrador USB el dispositivo está conectado a, también. Esto dará lugar, entre otras cosas, a acciones de desconexión/desconexión aparentes, ya que verá un globo emergente cuando esto ocurra.

Mucho de esto está mal documentado, y honestamente, tengo la impresión de que solo hay un puñado de personas en Microsoft que realmente lo entienden bien.La decisión de diseño que he tomado para futuros dispositivos que diseño es que tengo la intención de incluir la funcionalidad de vigilancia en ambos lados, así como también la función de restablecimiento completo del lado del dispositivo. De esta forma, si el dispositivo se da cuenta de que está confundido, puede cortar su propia energía por un segundo y reiniciar completamente, si el host no se puede comunicar con él, podría hacer lo mismo, y si el dispositivo piensa que todo es bien, pero el host sabe mejor, el host podría ordenar que se restablezca.

Hay al menos tres API que vale la pena investigar para este problema: la API de configuración, la API del Administrador de configuración y varias extensiones de WMI. Sin embargo, tenga cuidado al sumergirse en WMI si tiene la intención de utilizar un objetivo de Embedded XP, ya que deberá incluir muchas otras cosas en su imagen de sistema operativo que de otra manera no necesitaría.

Cuestiones relacionadas