Solicitudes USB y pasos de transferencia de control (Parte 4/6)

En el artículo anterior de esta serie, se analizaron los descriptores USB . Cuando un periférico USB está conectado a un dispositivo host, el host envía consultas en forma de solicitudes. El periférico responde enviando Descriptores. Los descriptores contienen la información necesaria para identificar y configurar el dispositivo perimetral, implementar las interfaces y configurar los puntos finales. El descriptor de dispositivo es el primer descriptor enviado al host y ayuda a configurar el periférico en relación con el host. Los descriptores posteriores implementan la operación para la cual está diseñado el periférico.

Control Transfer es el único tipo de transferencia admitido incluso cuando el dispositivo aún no está configurado. Por tanto, se utiliza para enviar solicitudes y obtener descriptores. El terminal predeterminado es el terminal 0, que es bidireccional y se utiliza para transferencias de control.

Por lo tanto, la primera solicitud solicitada por el host desde el periférico implica sólo una transferencia de control. Como se mencionó anteriormente al analizar el protocolo USB, la transferencia de control consta de tres transacciones: transacción de configuración, transacción de datos (opcional) y transacción de estado.

1. TRANSACCIÓN DE CONFIGURACIÓN

La transferencia de control comienza con una etapa de configuración. En esta etapa se utiliza la transacción de configuración. La transacción consta de tres paquetes: Token, Datos y Handshake.

Paquete de tokens: contiene PID de configuración (identificador de paquete), dirección del dispositivo, punto final y CRC. Se utilizan el punto final predeterminado y la dirección del dispositivo 0. La dirección se actualiza después de asignar una dirección única al dispositivo. Este paquete es enviado por el host.

Paquete de datos: Contiene Data0 PID. La carga útil de datos es de 8 bytes. Este paquete también lo envía el host. El contenido de la carga útil de datos incluye los siguientes campos:

• bmRequestType : este campo proporciona información relacionada con la dirección de los datos, el tipo de solicitud y el destinatario designado. El bit 7 representa la dirección del flujo de datos en la etapa de datos. Los bits 5 a 6 representan el tipo de solicitud. El bit 4-0 especifica el destinatario de la solicitud.

• bRequest : el tipo de solicitud se puede seleccionar mediante bmRequestType. El valor único de bRequest especifica una de las solicitudes seleccionadas. Por ejemplo, el valor bRequest se puede utilizar para seleccionar una de las solicitudes USB estándar.

• wValue : este campo especifica la información que se debe pasar del host al dispositivo con la solicitud. Por ejemplo, en la solicitud Set_Address, wValue contiene la dirección del dispositivo.

• wIndex : este campo también especifica la información que se debe pasar del host al dispositivo con la solicitud. El uso típico incluye pasar el punto final o el número de interfaz. Para el punto final, el bit 3-0 representa el número del punto final y el bit 7 representa la dirección; 0: APAGADO; 1 EN. Para la interfaz, el bit 7-0 representa el número de interfaz.

• longitud : este campo indica el número de bytes que se transferirán en la etapa de datos. Para la transferencia de host a dispositivo, este campo especifica la cantidad exacta de datos que transferirá el host. Para la transferencia de dispositivo a host, este campo especifica la cantidad máxima de datos que el dispositivo puede transferir. Para ninguna etapa de datos, este campo es cero.

Tabela de listagem de campos de pacote de dados na transação de configuração de USB

Fig. 1: Tabla que enumera los campos del paquete de datos en la transacción de configuración USB

Paquete de protocolo de enlace: este paquete lo envía el dispositivo periférico al host en la etapa de configuración. Contiene confirmación (ACK) de si el paquete de datos se recibió sin errores. Si se produce un error, el paquete de protocolo de enlace no se devolverá.

Imagem mostrando o formato dos dados da transação de configuração

Fig. 2: Imagen que muestra el formato de datos de transacción de configuración

2. TRANSACCIÓN DE DATOS

Esta es la segunda etapa opcional de la Transferencia de Control. En esta etapa se transfieren los datos solicitados. Contiene múltiples transacciones IN o OUT. Cada transacción contiene tres paquetes: Token, Datos y Handshake.

Paquete de tokens: este paquete contiene un PID que especifica si la transacción es ENTRADA o SALIDA, la dirección del dispositivo, el punto final y el CRC. Este paquete es enviado por el host.

Paquete de datos : este paquete se utiliza para transferir los datos solicitados. La longitud de los datos ya está especificada en el campo wLength. Los datos se pueden enviar en más de un paquete si la longitud de los datos excede el valor de longitud máxima del paquete. Utilizó el PID Data1 para el primer paquete y Data0/Data1 alternativo adicional. Para la transacción IN, el dispositivo envía los datos y para la transacción OUT, el Host envía los datos.

Paquete de protocolo de enlace: este paquete lo envía el host si hay una transacción IN. El dispositivo envía este paquete en caso de transacción OUT. El paquete proporciona el estado del paquete de datos recibido. Este paquete puede devolver ACK (datos válidos recibidos), NAK (ocupado), STALL (solicitud no admitida o punto final detenido) o NYET (los datos de la transacción actual se aceptaron pero aún no están listos para otro paquete de datos). El anfitrión sólo puede devolver ACK.

Imagem mostrando o formato dos dados da transação de dados

Fig. 3: Imagen que muestra el formato de datos de la Transacción de Datos

Imagem mostrando pacotes de transações de entrada e saída

Fig. 4: Imagen que muestra paquetes de transacciones entrantes y salientes

3. ESTADO DE LA TRANSACCIÓN

El propósito de la Etapa de Estado es el mismo que el de un Paquete de Apretón de Manos. La única diferencia es que el paquete Handshake proporciona información sobre el estado o la finalización de una sola transacción, mientras que la transacción Status proporciona el estado sobre el éxito o el fracaso de toda la transferencia. La transacción de estado proporciona retroalimentación o el estado de finalización de los pasos mencionados anteriormente. Cada transacción contiene tres paquetes: Token, Datos y Handshake.

Paquete de tokens: este paquete contiene un PID que especifica si la transacción es ENTRADA o SALIDA, la dirección del dispositivo, el punto final y el CRC. Este paquete es enviado por el host. El valor de PID será IN si las transacciones en la Etapa de Datos están FUERA y viceversa.

Paquete de datos: este paquete utiliza el PID Data1. Se utiliza para especificar el estado de toda la transferencia. Los valores de datos posibles pueden ser cero, lo que indica éxito, NAK (ocupado) o STALL (punto final detenido). El host solo puede transferir datos de longitud cero. Para la etapa sin datos, la etapa de estado especifica si se ha cumplido la solicitud. Por ejemplo, en la solicitud Set_address, esta etapa indica que se ha asignado la dirección única proporcionada por el Host.

Paquete de protocolo de enlace: este paquete lo envía el host si hay una transacción IN. El dispositivo perimetral envía este paquete si está en una transacción OUT. El PID puede ser ACK (éxito), NAK (ocupado) o STALL (solicitud no admitida o punto final detenido). El host responde con ACK cuando los datos se reciben correctamente. Si el receptor detecta un error en el token o en el paquete de datos, no se transferirá ningún paquete de protocolo de enlace. Este paquete es el paquete final de la transferencia.

Imagem mostrando o formato dos dados da transação de status

Fig. 5: Imagen que muestra el formato de datos de la transacción de estado

Imagem mostrando o formato de dados da transferência de controle USB

Fig. 6: Imagen que muestra el formato de datos de transferencia de control USB

Solicitudes USB estándar

Las siguientes son solicitudes estándar enviadas por un dispositivo host a un periférico:

GET_STATUS: esta solicitud se utiliza para obtener información sobre el estado del dispositivo, la interfaz o el punto final. El dispositivo devuelve dos bytes en la etapa de datos. El destinatario puede ser un dispositivo, una interfaz o un punto final según el valor del campo bmRequestType. El número de interfaz o el número de terminal se puede seleccionar utilizando el campo wIndex. Según el destinatario designado, el dispositivo devuelve el estado del dispositivo, el estado de la interfaz o el estado del terminal.

Tabela de listagem de campos de status do dispositivo

Fig. 7: Tabla de listado de campos de estado del dispositivo

Tabela Listagem de Campos de Status da Interface

Fig. 8: Tabla de listado de campos de estado de la interfaz

Campos de listagem de tabela de status do endpoint

Fig. 9: Tabla de listado de campos de estado del terminal

SET_FEATURE/CLEAR_FEATURE: estas solicitudes se utilizan para habilitar o deshabilitar funciones del dispositivo, interfaz o punto final. El destinatario puede ser un dispositivo, una interfaz o un punto final según el valor del campo bmRequestType. El número de interfaz o el número de terminal se puede seleccionar utilizando el campo wIndex. El dispositivo no devuelve datos en estas solicitudes. El recurso se puede seleccionar utilizando el campo wValue.

Campos de listagem de tabela de status do endpoint

Fig. 10: Tabla de listado de campos SET_FEATURE/CLEAR_FEATURE

Hay un recurso para un punto final: ENDPOINT_HALT. Configurar esta característica DETENDRÁ cualquier transacción de ENTRADA o SALIDA a un punto final. No hay ningún recurso para una interfaz. Hay cinco características posibles para un dispositivo. Ellos son :

DEVICE_REMOTE_WAKEUP : configurar esta función permite que un dispositivo en espera solicite al host que reanude la comunicación mediante una señal al host.

• TEST_MODE: si esta función está configurada, el dispositivo entrará en modo de prueba.

• B_HNP_ENABLE: esta función solo se aplica en dispositivos OTG.

• A_HNP_ENABLE: esta función solo se aplica en dispositivos OTG.

• A_ALT_HNP_SUPPORT: esta función solo se aplica en dispositivos OTG

SET_ADDRESS: esta solicitud se utiliza para asignar una dirección única al dispositivo para las comunicaciones. A un dispositivo conectado al bus se le pueden asignar direcciones entre 1 y 127. El dispositivo utiliza la dirección predeterminada 0 antes de que se asigne una dirección única. Una vez completado el paso de estado de esta solicitud, el dispositivo USB cambia de dirección. El dispositivo debe cambiar su dirección dentro de los 20 ms posteriores a completar la etapa de estado.

Existe una diferencia entre la solicitud SET_ADDRESS y todas las demás solicitudes. En otras solicitudes, la acción de solicitud se realiza antes de que se complete la etapa de estado, mientras que en la solicitud SET_ADDRESS, la acción de resultado se realiza después de que se complete la etapa de estado. El dispositivo no devuelve datos en esta solicitud.

GET_DESCRIPTOR: esta solicitud se utiliza para obtener el descriptor especificado del dispositivo USB y ayuda a identificar y configurar el dispositivo. La información relacionada con dispositivos, puntos finales, configuraciones e interfaces se puede obtener mediante esta solicitud.

El byte alto del campo wValue especifica el tipo de descriptor y el byte bajo especifica el índice del descriptor. El índice de descriptor se utiliza cuando hay más de un descriptor disponible para un tipo determinado. El índice de descriptor solo se usa para configuración y descriptores de cadena. Por ejemplo, un dispositivo puede tener más de un descriptor de configuración.

Campos de listagem de tabela de GET_DESCRIPTOR

Fig. 11: Tabla de listado de campos GET_DESCRIPTOR

El valor wIndex especifica el ID de idioma para los descriptores de cadena y para otros descriptores el valor es cero. El campo wLength especifica el tamaño máximo del descriptor que puede enviar el dispositivo.

SET_DESCRIPTOR : esta solicitud se utiliza para agregar un nuevo descriptor o actualizar un descriptor existente. Esta solicitud es opcional y no se utiliza con frecuencia. Los campos wValue, wIndex y wLength contienen la misma información que GET_DESCRIPTOR.

SET_CONFIGURATION : esta solicitud se utiliza para establecer o activar una configuración específica para el dispositivo. Después de obtener información de configuración como PID/VID, el host carga el controlador y utiliza la solicitud SET_CONFIGURATION para configurar el dispositivo.

Si solo hay una configuración para un dispositivo, wValue se establecerá en 1. Para otras configuraciones, si es posible, se usará wValue para definir la configuración específica. Si wValue se establece en cero, desconfigurará el dispositivo. El campo wIndex y wLength es cero. El dispositivo no devuelve datos en esta solicitud. Una vez que el dispositivo está configurado, puede responder a otros tipos de transferencias además de Control Transfer.

GET_CONFIGURATION : esta solicitud se utiliza para obtener información de configuración actual definida por la solicitud SET_CONFIGURATION. El valor de configuración lo devuelve el dispositivo en la etapa de datos.

SET_INTERFACE: Cuando se configura el dispositivo, se selecciona una interfaz predeterminada. Esta solicitud se utiliza para seleccionar una interfaz alternativa distinta de la interfaz predeterminada. Si la interfaz solicitada o la configuración alternativa no existe, el dispositivo devuelve un STALL.

GET_INTERFACE: esta solicitud se utiliza para verificar qué interfaz alternativa fue seleccionada por SET_INTERFACE.

SYNCH_FRAME : esta solicitud se utiliza en algunas transferencias isócronas donde el tamaño de los datos varía con el marco. Por ejemplo, un punto final puede enviar una secuencia de 8,8,64 bytes. El anfitrión utiliza esta solicitud para saber el fotograma exacto en el que comienza la repetición. El dispositivo responde a esto con datos que contienen el número de fotograma en el que comienza el patrón. Esta solicitud rara vez se utiliza.

Las solicitudes de USB estándar se resumen a continuación:

Tabela listando solicitações USB padrão

Tabela listando solicitações USB padrão

Fig. 12: Tabla que enumera las solicitudes de USB estándar

Validez de las solicitudes

Cuando se realiza una solicitud, el dispositivo puede estar en uno de tres estados:

1. Estado predeterminado: este estado ocurre cuando el dispositivo está conectado y no se ha asignado una dirección única. En este estado, las solicitudes válidas que se pueden realizar son solo GET_DESCRIPTOR y SET_ADDRESS.

2. Estado direccionado: este estado ocurre cuando al dispositivo se le ha asignado una dirección única a través de la solicitud SET_ADDRESS. En esto, el dispositivo está listo para aceptar las siguientes solicitudes:

• ESTABLECER_CONFIGURACIÓN

• OBTENER_CONFIGURACIÓN

• ESTABLECER_CARACTERÍSTICA

• CLEAR_FEATURE

• OBTENER EL ESTADO

• SET_DESCRIPTOR

3. Estado configurado: este estado ocurre cuando el dispositivo se ha configurado mediante la solicitud SET_CONFIGURATION y ahora está listo para realizar operaciones. En este caso, SET_ADDRESS no es una solicitud válida. Las solicitudes que se pueden realizar sólo después de la configuración son:

• GET_INTERFACE

• CONJUNTO_INTERFACE

• SINCRONIZACIÓN_FRAME

En el próximo artículo se tratará la señalización y codificación en la interfaz USB .

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.