¿Puede un dispositivo USB intentar ser alimentado por bus y luego volver a ser autoalimentado?

El dispositivo tiene una batería, pero sería bueno tener alimentación por bus cuando esté disponible. Una computadora generalmente suministrará 500 mA, por ejemplo, mientras que un teléfono inteligente en modo OTG solo necesita suministrar 8 mA .

¿Es posible hacer algo como esto?

  1. solicitud 500mA
  2. si se acepta: energía desde la computadora y carga de la batería desde la computadora
  3. otro: solicitar 200 mA
  4. si se acepta: energía de la computadora
  5. más: reclamo autoalimentado, energía de la batería

Esto parece ser para lo que son las configuraciones :

Por lo tanto, es posible tener dos configuraciones, una para cuando el dispositivo se alimenta desde el bus y otra cuando se alimenta desde la red. ... Una vez que el host haya examinado todas las configuraciones, el host enviará un comando SetConfiguration con un valor distinto de cero que coincida con el bConfigurationValue de una de las configuraciones. Esto se utiliza para seleccionar la configuración deseada.

¿Es suficiente especificar varias configuraciones en los descriptores, una para cada requisito actual? ¿El sistema operativo los prueba automáticamente en orden y pasa al siguiente si uno falla?

Los dispositivos USB de configuración múltiple y Windows parecen decir que así es como funciona:

Durante la enumeración, USBCCGP primero intentará seleccionar la configuración cuyo descriptor se encuentra en el índice "original" especificado. Si el intento falla, normalmente debido a que la configuración requiere más de 100 mA mientras que el concentrador ascendente del dispositivo solo tiene alimentación de bus, entonces USBCCGP intenta seleccionar la configuración que se encuentra en el índice "alternativo" especificado.

Sin embargo, esto no funciona en la práctica? :

“Los controladores de Microsoft funcionan invariablemente con solo la primera configuración de un dispositivo. El soporte de Microsoft para dispositivos compuestos no se activará si el dispositivo tiene varias configuraciones. En consecuencia, los dispositivos de configuración múltiple parecen ser raros en la práctica, y Microsoft desalienta a las personas a diseñar otros nuevos” .

y :

Los controladores de Microsoft solo solicitarán la primera configuración, y si eso requiere demasiada corriente, que así sea.

y :

no es común tener más de una configuración. Los controladores estándar de Windows siempre seleccionarán la primera configuración, por lo que no tiene mucho sentido.

Si varias configuraciones no funcionan en la práctica, ¿puede el dispositivo detectar que ha sido rechazado, simular una desconexión y volver a conectarse con un conjunto diferente de descriptores?

(Esta es una pregunta sobre la parte de enumeración/comunicación USB, no la implementación de hardware de cómo conectar la batería, etc.)

Creo que, de hecho, podría funcionar, y definir múltiples configuraciones como usted ha descrito sería la forma de hacerlo, pero como han señalado otros, no hay forma de garantizar cómo un controlador (genérico) de Windows tratará el dispositivo. . Por supuesto, si escribe su propio controlador, puede hacer que el host trate el dispositivo de la forma en que desea que lo trate, pero escribir controladores de Windows no es para los débiles de corazón.

Respuestas (1)

Eso define un proceso de enumeración normal. Si no funciona para usted de esa manera, y está programando el lado del periférico USB, entonces podría hacerlo sin problemas.

Enumerar, falló en la solicitud de 500 mA. El anfitrión debe señalar esta falla de enumeración de acuerdo con las especificaciones .

El dispositivo desconecta los pines de datos usb, cambia su descriptor usb y señala nuevamente para la enumeración.

Si falló. Repita, cambiando su descriptor para que lea autoalimentado nuevamente. Debe tener un método para cambiar el pin de alimentación. Un interruptor de alimentación USB, por ejemplo. Un diodo O puente si la caída de voltaje es aceptable. No puede retroalimentar el VUSB con su batería a menos que quiera romper algo. Luego señale de nuevo.

El descriptor no es más que unos pocos bytes que puede cambiar a través de variables. Mientras puedas cambiar eso, estás bien.

¿Cómo señala exactamente el host el error de enumeración?
@CL., esta no es la enumeración "falla", es un rechazo de un dispositivo si su requisito de energía no se ajusta al presupuesto de energía actual del host. La enumeración de un dispositivo USB se completa cuando el host establece la "configuración" después de configurar la dirección del dispositivo leyendo un montón de descriptores. Si esta última parte del protocolo de enumeración no se completa, el dispositivo puede saberlo y realizar el cambio descrito por Passerby.
"El dispositivo desconecta los pines de datos USB" ¿Puede simplemente bajar el pull-up en D+ para desconectar?
"Cuando se conecta por primera vez a USB, CX3 enumera automáticamente con el ID de proveedor de Cypress (0x04B4) y descarga el firmware y los descriptores USB a través de la interfaz USB. El firmware descargado ejecuta una desconexión y conexión eléctrica. CX3 enumera nuevamente, esta vez como un dispositivo definido por la información descargada. Este proceso patentado de dos pasos, llamado ReNumeration, ocurre instantáneamente cuando se conecta el dispositivo". ¿No pueden haber patentado la reenumeración en sí? ¿Solo todo el proceso del gestor de arranque?
¿Esta respuesta está influenciada por si USB-C está en uso o no?
@Reinderien Con USB C, tiene un pin que usa para PD y vuelve a estos pasos si el otro dispositivo anuncia que necesita seguir los pasos de USB anteriores. El USB C brinda un perfil de corriente/voltaje, y puede aceptarlo con la misma corriente, una corriente más baja o la misma con un indicador establecido que desea más potencia, en cuyo caso el otro lado hará todo lo posible para dar más potencia (un concentrador USB C podría "reenviar" la solicitud al flujo ascendente para obtener más potencia)