Solicitações USB e etapas de transferência de controle (Parte 4/6)

No artigo anterior desta série, Descritores USB foram discutidos. Quando um periférico USB é conectado a um dispositivo host, o host envia consultas na forma de solicitações. O periférico responde enviando Descritores. Os Descritores contêm as informações necessárias para identificar e configurar o dispositivo periférico, implementar as interfaces e configurar os endpoints. O descritor de dispositivo é o primeiro descritor enviado ao host e auxilia na configuração do periférico em relação ao host. Os descritores subsequentes implementam o funcionamento ao qual o periférico se destina.

A Transferência de Controle é o único tipo de transferência suportado mesmo quando o dispositivo ainda não está configurado. Por isso, é utilizado para envio de solicitações e obtenção dos descritores. O terminal padrão é o terminal 0, que é bidirecional e usado para transferências de controle.

Portanto, a primeira solicitação solicitada pelo host ao periférico envolve apenas uma transferência de controle. Conforme discutido anteriormente ao discutir o protocolo USB, a transferência de controle consiste em três transações – transação de configuração, transação de dados (opcional) e transação de status.

1. TRANSAÇÃO DE CONFIGURAÇÃO

A transferência de controle começa com um estágio de configuração. A transação de configuração é usada neste estágio. A transação consiste em três pacotes – Token, Dados e Handshake.

Pacote de tokens: Ele contém PID de configuração (identificador de pacote), endereço do dispositivo, endpoint e CRC. O endpoint padrão e o endereço do dispositivo 0 são usados. O endereço é atualizado após atribuir um endereço exclusivo ao dispositivo. Este pacote é enviado pelo host.

Pacote de dados: Ele contém Data0 PID. A carga útil de dados tem 8 bytes. Este pacote também é enviado pelo host. O conteúdo da carga de dados inclui os seguintes campos:

• bmRequestType – Este campo fornece informações relacionadas à direção dos dados, tipo de solicitação e destinatário designado. O bit 7 representa a direção do fluxo de dados no estágio de dados. Os bits 5 a 6 representam o tipo de solicitação. O bit 4-0 especifica o destinatário da solicitação.

• bSolicitação – O tipo de solicitação pode ser selecionado por bmRequestType. O valor exclusivo de bRequest especifica uma das solicitações selecionadas. Por exemplo, o valor bRequest pode ser usado para selecionar uma das solicitações USB padrão.

• wValor – Este campo especifica as informações que precisam ser passadas do host para o dispositivo com a solicitação. Por exemplo, na solicitação Set_Address, wValue contém o endereço do dispositivo.

• wIndex – Este campo também especifica as informações que precisam ser passadas do host para o dispositivo com a solicitação. O uso típico inclui passar o ponto final ou o número da interface. Para ponto final, o bit 3-0 representa o número do ponto final e o bit 7 representa a direção; 0: FORA; 1: DENTRO. Para interface, o bit 7-0 representa o número da interface.

• comprimento – Este campo indica o número de bytes a serem transferidos no estágio de dados. Para transferência de host para dispositivo, este campo especifica a quantidade exata de dados que o host transferirá. Para transferência de dispositivo para host, este campo especifica a quantidade máxima de dados que o dispositivo pode transferir. Para nenhum estágio de dados, esse campo é zero.

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

Fig. 1: Tabela listando os campos do pacote de dados na transação de configuração do USB

Pacote de aperto de mão: Este pacote é enviado pelo dispositivo periférico ao host no Setup Stage. Ele contém confirmação (ACK) se o pacote de dados foi recebido sem erros. Se ocorrer um erro, o pacote de handshake não será retornado.

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

Fig. 2: Imagem mostrando o formato dos dados da transação de configuração

2. TRANSAÇÃO DE DADOS

Este é o segundo estágio opcional da Transferência de Controle. Nesta etapa são transferidos os dados solicitados. Ele contém várias transações IN ou OUT. Cada transação contém três pacotes, Token, Dados e Handshake.

Pacote de tokens: Este pacote contém PID que especifica se a transação é IN ou OUT, endereço do dispositivo, endpoint e CRC. Este pacote é enviado pelo host.

Pacote de dados: Este pacote é usado para transferir os dados solicitados. O comprimento dos dados já está especificado pelo campo wLength. Os dados podem ser enviados em mais de um pacote se o comprimento dos dados exceder o valor máximo do comprimento do pacote. Ele usou Data1 PID para o primeiro pacote e Data0/Data1 alternativo adicional. Para transação IN, o dispositivo envia os dados e para transação OUT, o Host envia os dados.

Pacote de aperto de mão: Este pacote é enviado pelo Host se houver uma transação IN. O dispositivo envia este pacote em caso de transação OUT. O pacote fornece o status do pacote de dados recebido. Este pacote pode retornar ACK (dados válidos recebidos), NAK (ocupado), STALL (solicitação não suportada ou endpoint interrompido) ou NYET (os dados da transação atual foram aceitos, mas ainda não estão prontos para outro pacote de dados). O host só pode retornar ACK.

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

Fig. 3: Imagem mostrando o formato dos dados da Transação de Dados

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

Fig. 4: Imagem mostrando pacotes de transações de entrada e saída

3. TRANSAÇÃO DE STATUS

O objetivo do Status Stage é o mesmo de um Handshake Packet. A única diferença é que o pacote Handshake fornece informações de status ou conclusão para uma única transação, enquanto a transação Status fornece status sobre o sucesso ou falha de toda a transferência. A transação de status fornece feedback ou status da conclusão das etapas mencionadas acima. Cada transação contém três pacotes, Token, Dados e Handshake.

Pacote de tokens: Este pacote contém PID que especifica se a transação é IN ou OUT, endereço do dispositivo, endpoint e CRC. Este pacote é enviado pelo host. O valor do PID será IN se as transações no Data Stage forem OUT e vice-versa.

Pacote de dados: Este pacote usa Data1 PID. É usado para especificar o status de toda a transferência. Os valores possíveis dos dados podem ser zero, o que indica sucesso, NAK (ocupado) ou STALL (endpoint interrompido). O host só pode transferir dados de comprimento zero. Para nenhum estágio de dados, o Estágio de Status especifica se a solicitação foi atendida. Por exemplo, na solicitação Set_address, este estágio indica que o endereço exclusivo fornecido pelo Host foi alocado.

Pacote de aperto de mão: Este pacote é enviado pelo Host se houver uma transação IN. O dispositivo periférico envia este pacote se estiver em uma transação OUT. O PID pode ser ACK (sucesso), NAK (ocupado) ou STALL (solicitação não suportada ou endpoint interrompido). O host responde com ACK para dados recebidos com sucesso. Se o receptor detectar algum erro no token ou no pacote de dados, nenhum pacote de handshake será transferido. Este pacote é o pacote final da transferência.

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

Fig. 5: Imagem mostrando o formato dos dados da Transação de Status

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

Fig. 6: Imagem mostrando o formato de dados da transferência de controle USB

Solicitações USB padrão

A seguir estão as solicitações padrão enviadas por um dispositivo host para um periférico:

GET_STATUS: Esta solicitação é usada para obter informações de status do dispositivo, interface ou endpoint. O dispositivo retorna dois bytes no estágio de dados. O destinatário pode ser dispositivo, interface ou endpoint dependendo do valor do campo bmRequestType. O número da interface ou número do terminal pode ser selecionado usando o campo wIndex. De acordo com o destinatário designado, o dispositivo retorna Status do Dispositivo, Status da Interface ou Status do Endpoint.

Tabela de listagem de campos de status do dispositivo

Fig. 7: Tabela de listagem de campos de status do dispositivo

Tabela Listagem de Campos de Status da Interface

Fig. 8: Tabela de listagem de campos de status da interface

Campos de listagem de tabela de status do endpoint

Fig. 9: Tabela de listagem de campos de status do endpoint

SET_FEATURE/CLEAR_FEATURE: Essas solicitações são usadas para ativar ou desativar recursos do dispositivo, interface ou endpoint. O destinatário pode ser dispositivo, interface ou endpoint dependendo do valor do campo bmRequestType. O número da interface ou número do terminal pode ser selecionado usando o campo wIndex. O dispositivo não retorna dados nessas solicitações. O recurso pode ser selecionado usando o campo wValue.

Campos de listagem de tabela de status do endpoint

Fig. 10: Tabela de listagem de campos de SET_FEATURE/CLEAR_FEATURE

Existe um recurso para um endpoint – ENDPOINT_HALT. Definir esse recurso irá PARAR quaisquer transações IN ou OUT para um endpoint. Não há nenhum recurso para uma interface. Existem cinco recursos possíveis para um dispositivo. Eles são :

DEVICE_REMOTE_WAKEUP – Definir esse recurso permite que um dispositivo em espera solicite ao host que retome a comunicação por meio de sinalização ao host.

• TEST_MODE – Se este recurso estiver configurado, o dispositivo entrará no modo de teste.

• B_HNP_ENABLE – Este recurso é aplicável apenas em dispositivos OTG.

• A_HNP_ENABLE – Este recurso é aplicável apenas em dispositivos OTG.

• A_ALT_HNP_SUPPORT – Este recurso só é aplicável em dispositivos OTG

SET_ADDRESS: Esta solicitação é usada para alocar um endereço exclusivo ao dispositivo para comunicações. Um dispositivo conectado ao barramento pode receber endereços entre 1 e 127. O dispositivo usa o endereço padrão 0 antes da alocação de um endereço exclusivo. Após a conclusão da Etapa de Status desta solicitação, o dispositivo USB muda de endereço. O dispositivo deve alterar seu endereço dentro de 20 ms após completar o Estágio de Status.

Há uma diferença entre a solicitação SET_ADDRESS e todas as outras solicitações. Em outras solicitações, a ação de solicitação é executada antes da conclusão do Estágio de Status, enquanto na solicitação SET_ADDRESS, a ação de resultado é executada após a conclusão do Estágio de Status. O dispositivo não retorna dados nesta solicitação.

GET_DESCRIPTOR: Esta solicitação é usada para obter o descritor especificado do dispositivo USB e auxilia na identificação e configuração do dispositivo. Informações relacionadas a dispositivos, endpoints, configurações e interfaces podem ser obtidas usando esta solicitação.

O byte alto do campo wValue especifica o tipo de descritor e o byte baixo especifica o índice do descritor. O índice do descritor é usado quando há mais de um descritor disponível para um determinado tipo. O índice do descritor é usado apenas para configuração e descritores de string. Por exemplo, um dispositivo pode ter mais de um descritor de configuração.

Campos de listagem de tabela de GET_DESCRIPTOR

Fig. 11: Tabela de listagem de campos de GET_DESCRIPTOR

O valor wIndex especifica o ID do idioma para descritores de string e para outros descritores o valor é zero. O campo wLength especifica o tamanho máximo do descritor que pode ser enviado pelo dispositivo.

SET_DESCRIPTOR: esta solicitação é usada para adicionar um novo descritor ou atualizar um descritor existente. Esta solicitação é opcional e não é usada com frequência. Os campos wValue, wIndex e wLength carregam as mesmas informações de GET_DESCRIPTOR.

SET_CONFIGURAÇÃO: esta solicitação é usada para definir ou ativar uma configuração específica para o dispositivo. Após obter informações de configuração como PID/VID, o Host carrega o driver e utiliza a solicitação SET_CONFIGURATION para configurar o dispositivo.

Se houver apenas uma configuração para um dispositivo, wValue será definido como 1. Para outras configurações, se possível, wValue será usado para definir a configuração específica. Se wValue for definido como zero, ele desconfigurará o dispositivo. O campo wIndex e wLength é zero. O dispositivo não retorna dados nesta solicitação. Depois que o dispositivo estiver configurado, ele poderá responder a outros tipos de transferência além da Transferência de Controle.

GET_CONFIGURATION: Esta solicitação é usada para obter informações da configuração atual definida pela solicitação SET_CONFIGURATION. O valor da configuração é retornado pelo dispositivo no estágio de dados.

CONJUNTO_INTERFACE: Quando o dispositivo é configurado, uma interface padrão é selecionada. Esta solicitação é usada para selecionar uma interface alternativa diferente da interface padrão. Se a interface ou configuração alternativa solicitada não existir, o dispositivo retornará um STALL.

GET_INTERFACE: Esta solicitação é usada para verificar qual interface alternativa foi selecionada por SET_INTERFACE.

SYNCH_FRAME: esta solicitação é usada em algumas transferências isócronas onde o tamanho dos dados varia com o quadro. Por exemplo, um endpoint pode enviar uma sequência de 8,8,64 bytes. O host utiliza esta solicitação para saber o quadro exato em que a repetição começa. O dispositivo responde a isso com dados contendo o número do quadro no qual o padrão começa. Esta solicitação raramente é usada.

As solicitações USB padrão foram resumidas abaixo:

Tabela listando solicitações USB padrão

Tabela listando solicitações USB padrão

Fig. 12: Tabela listando solicitações USB padrão

Validade das Solicitações

Quando uma solicitação é feita, o dispositivo pode estar em um dos três estados:

1. Estado padrão: Este estado ocorre quando o dispositivo está conectado e um endereço exclusivo não foi alocado. Neste estado, as requisições válidas que podem ser feitas são apenas GET_DESCRIPTOR e SET_ADDRESS.

2. Estado endereçado: Este estado ocorre quando o dispositivo recebeu um endereço exclusivo por meio da solicitação SET_ADDRESS. Neste, o dispositivo está pronto para aceitar as seguintes solicitações:

• SET_CONFIGURAÇÃO

• GET_CONFIGURAÇÃO

• SET_FEATURE

• CLEAR_FEATURE

• GET_STATUS

• SET_DESCRIPTOR

3. Estado configurado: Este estado ocorre quando o dispositivo foi configurado usando a solicitação SET_CONFIGURATION e agora está pronto para realizar operações. Neste, SET_ADDRESS não é uma solicitação válida. As solicitações que podem ser feitas somente após a configuração são:

• GET_INTERFACE

• SET_INTERFACE

• SYNCH_FRAME

No próximo artigo sinalização e codificação em interface USB será discutido.

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.