Onde exatamente está a especificação USB que explica o que fazer quando o cabo é conectado pela primeira vez?


15

Então, eu sei sobre a especificação USB 2.0 localizada no site USB.org .

Eu sou um pouco preguiçoso e impaciente. Alguém pode me dizer para onde ir para descobrir exatamente o que é esperado do meu dispositivo periférico quando o cabo USB estiver conectado?

Por exemplo, se meu dispositivo periférico é uma impressora, como posso informar ao computador na outra extremidade que uma impressora (com uma descrição específica do modelo, suponho) acabou de ser conectada? No computador, como o driver da impressora sabe qual porta USB foi conectada à impressora?

Minha aplicação é realmente USB MIDI. Também recebi este documento USB-MIDI , mas não tenho o protocolo USB mais fundamental.

Apenas para informação das pessoas, o chip USB que estou usando é o FTDI FT220x e está conectado ao SPI de um SHArC ADSP-21479. Agora o usamos simplesmente para comunicações de texto usando o PC (executando o TeraTerm) como um "console" . Eu tenho acesso ao código que configura a porta SPI e se conecta ao chip FTDI, mas não há código que faça nenhuma comunicação inicial. Não sei o que o FT220x faz quando é conectado pela primeira vez ao PC.

Não sou infeliz em ler e aprender, mas gostaria de saber por onde começar a ler, e uma especificação USB de 100 MB é um alvo muito grande para disparar. Agradecimentos sinceros a todos pela ajuda acionável.


1
Então você está curioso sobre o que a FTDI FT220x está fazendo nos bastidores, certo? Como o FTDI cuida de muitas coisas de USB para você, também existem alguns limites para o que ele permitirá que você faça. Eu usei a família FT2232H por algum tempo, vou tentar explicar o que eu sei ...
Marku

o que estou tentando fazer é usar essa porta USB que já é inteligente o suficiente para enviar e receber texto para o PC executando o TeraTerm, o que eu esperava fazer era usar o mesmo conector USB para USB MIDI. Eu preciso entender como "empacotar" os dados em pacotes de 32 bits, mas pensei (e ainda penso) que deve haver algum protocolo que diga à outra extremidade que este é um dispositivo USB MIDI. (até agora, eu simplesmente não têm um controle sobre os fundamentos USB e sua resposta parece muito útil para me ir.)
Robert Bristow-johnson

Respostas:


21

O USB possui várias camadas, descritas na especificação USB 2.0 . Se você conhece o modelo de rede em camadas OSI, pode pensar assim:

  • Camada da sessão = Capítulo 10 Hardware e software host USB (drivers de dispositivo)
  • Camada de transporte = Capítulo 9 Estrutura de dispositivos USB
  • Camada de rede = Capítulo 8 Camada de protocolo (fluxo de bits)
  • Camada Data Link = Capítulo 7 Elétrico (circuito)
  • Camada física = Capítulo 6 Mecânico (cabo e conector)

Conceitualmente, o USB é baseado em fluxos de dados, chamados Endpoints , que podem ser IN (para o host) ou OUT (do host). Todo dispositivo possui o Endpoint 0, que é usado para controle e status. Um dispositivo pode ter pontos de extremidade adicionais para dados do aplicativo. Cada nó de extremidade se comporta como um buffer FIFO.

Os dados são transferidos em um nó de extremidade como Bulk (como TCP / IP, garantido que cada byte chegue e na ordem correta) ou Isócrono (como UDP / IP, com garantia de atualização, mas pode descartar pacotes). Há um tipo de transferência " Interromper " chamado enganosamente , que é realmente apenas consultado pelo host.

O USB 2.0 usa um par diferencial para o datalink. Não entrarei em muitos detalhes, pois isso é coberto pelo capítulo 7. da especificação USB 2.0. Geralmente, no layout da placa de circuito impresso, tratamos isso como um par diferencial de comprimento combinado e inserimos os resistores em série exigidos por qualquer USB PHY (físico). Interface) está sendo usada. O periférico USB usa um resistor de alto valor em uma das linhas D + ou D- para notificar o host de que é um periférico de alta ou baixa velocidade.

Logo após o host USB descobrir que um dispositivo está presente, o host solicita vários descritores ao dispositivo. Isso é resolvido nos bastidores pelo chip FTDI. Os descritores estão descritos no capítulo 9.5 . Estes incluem dispositivos descritor , Configuração descritor , interface Descritores , Endpoint Descritores , Cordas Descritores , talvez até HID Relatório Descritores .

O descritor de dispositivo inclui os números USB VID (identificação do fornecedor) e PID (identificação do produto). O sistema operacional usa esse par de números, VID_PID, para determinar qual driver de dispositivo deve ser usado para este dispositivo. Observe que o número do VID é emitido ao ser membro do fórum de implementadores USB, então isso é um problema se você é um inventor individual.

Além disso, existe o driver de classe HID (Human Interface Device), que fornece entrada um tanto genérica para teclado / mouse / etc, assim como qualquer entrada / saída genérica. Uma vantagem do HID é que ele não requer o fornecimento de um driver de dispositivo personalizado, mas sua taxa de transferência é um pouco limitada em comparação com um driver em massa personalizado. Há todo um outro documento de especificação sobre os descritores HID; e um documento da Tabela de uso da HID que detalha todos os números de código que descrevem os vários recursos disponíveis em um determinado dispositivo com interface humana.

O chip FTDI, como a folha de dados do FT220X, fornece o "mecanismo de interface serial" USB (não deve ser confundido com o serial SPI ou o serial RS232). Isso cuida da maioria das coisas de baixo nível descritas nos capítulos 6, 7 e 8.

O FTDI usa uma EEPROM (desmarcação no FT2232H, on-chip no FT220X) para conter um pouco das informações que entram nos descritores. Você pode personalizar os valores VID / PID e fornecer seqüências de descrição personalizadas.


6
Gostei do resumo. Eu tive que ler a especificação THE INTEIRO 2.0 (mais de 1000 páginas, pelo que me lembro) durante um período de várias semanas porque tive que descobrir toda essa porcaria sozinha. Não foi uma experiência agradável, devo dizer. (Não foi possível usar o HID no meu caso.) Também não há bons livros sobre o assunto. Eu odiava o livro de Jan Axelson sobre USB e considero o livro "quase totalmente inútil" para alguém que tenta fazer esse trabalho como um micro incorporado desde o início. Na verdade, é praticamente inútil, caso contrário. Se você conhece um bom livro para um implementador (hardware personalizado), ficaria feliz em ouvir um título! 1
jonk

1
Dependendo do mercado potencial da Op, o VID / PID é o maior desafio. O uso da metodologia Axelsons funciona no sentido de que você pode usar o VID (que custa US $ 3,5 mil para o seu próprio país) e solicitar um ou mais PIDs gratuitamente. Você também pode solicitar PIDs de organizações como Microchip / Atmel, FTDI e TI (com base em seu VID). O melhor livro da IMO é Intels "design USB por exemplo", é um pouco longo, mas bom para USB 2.x. Infelizmente, muitos dos exemplos de código são interrompidos devido a alterações no Visual Studio por meio de suas revisões.
Jack Creasey

1
A melhor maneira de obter acesso ao VID / PID para amadores é usar o LUFA (que é gratuito): fourwalledcubicle.com/files/LUFA/Doc/130303/html/… ..... eles não podem ser usados ​​em produtos comerciais, mas são bons para uso em casa / demonstração, onde você pode controlar colisões em grande parte.
Jack Creasey

1
PS. Uma ótima introdução é usar o "Design USB incorporado por exemplo: que o FTDI lançou: ftdichip.com/Support/Documents/TechnicalPublications/… ... isso tem muitos exemplos úteis (é claro, com base nos dispositivos FTDI) e todos os associados arquivos de trabalho, incluindo o uso de controladores psoc.
Jack Creasey

1
Observe que, se o dispositivo USB for alimentado automaticamente, ele deverá aguardar a detecção da tensão do VBUS antes de aplicar o resistor pull-up D + ou D-. Eu falhei na certificação por causa disso.
Adam Haun

4

O comportamento e a interação dos "parceiros" USB (um host e um dispositivo) estão espalhados pela especificação USB. A melhor maneira de obter algumas justificativas é examinar a "estrutura do dispositivo", capítulo 9, que descreve os possíveis estados de dispositivo (obrigatórios) (Figura 9-1) e a estrutura Host (e Hub), nos capítulos 10 e 11. Ignorando detalhes do protocolo (pipes / tipos de transação / camadas abstratas do protocolo OSI, layout de PCB, etc.), pode-se obter uma melhor aderência à interação inicial estudando o diagrama do estado da porta (Figura 11-10).

Basicamente, se o cabo não estiver conectado entre o host e o dispositivo, as portas do host estarão em "Estado de alimentação" (VBUS está ativado), mas "Desconectado". Os fios D + e D- são mantidos baixos com suspensões de 15k.

Quando o cabo está conectado, o VBUS entra no dispositivo. O dispositivo reconhece que está sendo conectado e sinaliza um evento de "conexão" puxando ALTO um dos fios D, D + se for um dispositivo FS / HS e D- se for um dispositivo LS.

Puxar fios D +/- em uma determinada porta interrompe o host do software, relatando "alteração do status da porta". O software host (geralmente ehci.sys) inicia a sequência de "redefinição de porta" nessa porta específica . Após a conclusão bem-sucedida da "redefinição da porta USB", a porta do host é ativada para comunicação USB. A porta fica ativa (os pacotes de quadros começam a fluir).

Usando o protocolo USB, o host atribui um endereço exclusivo a este dispositivo e lê "descritor de dispositivo". Isso inicia o processo de "enumeração de dispositivos". O descritor do dispositivo contém informações sobre a qual classe de dispositivo pertence (HID, COM, MIDI, Impressora etc.) e o VID / PID desse dispositivo em particular, além de várias outras informações, consulte a Tabela 9-8.

Depois de obter a classe do dispositivo e o VID / PID, o software host tenta combinar essas informações no registro do dispositivo e carrega o driver DEVICE correspondente, genérico ou específico do fornecedor (se existir). O driver do dispositivo termina o processo de enumeração selecionando a interface do dispositivo que termina com a configuração "configuração do dispositivo". Obviamente, toda a comunicação USB é reconhecida atrás dessa porta específica , mesmo que todos os pacotes sejam transmitidos para todas as portas ativadas.

A descrição acima é a estrutura geral do protocolo de conexão USB. Empacotar dados para qualquer finalidade específica (como MIDI) é uma história diferente e é tratada no nível do aplicativo ou no nível do driver do dispositivo, se o sistema obtiver a classe de dispositivo adequada. Para obter comunicação MIDI nativa, o dispositivo deve ter essa classe em seu descritor e seguir todas as definições de classe MIDI .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.