Como é que a informação é enviada através
da interface USB?
Quando é
necessária transferência de informação, o software envia um bloco denominado
I/O Request Pack (IRP) ao canal apropriado, e mais tarde o software é avisado
quando este pedido é completado com sucesso ou terminado por erro. Além do
pedido IRP não existe qualquer outra interacção entre o canal e o USB. Após
três tentativas de reenvio o IRP é cancelado e todos os pedidos seguintes para
esse canal são ignorados até que o software responda ao sinal de erro, enviando
uma mensagem apropriada ao USB. A forma como isto é feito depende do tipo de
dispositivo e do software.
Como o
próprio nome sugere (Universal Serial Bus) a informação é enviada em série através
do bus. Os bytes de dados são divididos e enviados pelo bus um bit de cada vez.
A
informação é enviada através do bus por pacotes. Cada pacote é um conjunto de
dados, que incluem informação sobre a origem, destino e comprimento dos dados,
e além desta, informação relativa a detecção de erros. Como cada endpoint configura um limite para o
tamanho dos pacotes, um IRP pode necessitar que vários pacotes sejam enviados.
Se o host receber um pacote com um tamanho
inferior ao esperado assume que ocorreu um erro e o canal fica bloqueado,
ficando todos os IRPs cancelados até que o problema seja resolvido pelo
software. Se um endpoint estiver
ocupado, embora não haja ocorrência de erros, responde com um sinal especial
chamado NAK (Negative Acknowledge) que indica ao outro extremo do canal que
deve aguardar.
Cada pacote é composto por campos. Estes
são descritos em seguida:
- Um campo de sincronização que ocupa 8
bits. Parte deste campo é um símbolo especial utilizado para marcar o início do
pacote.
- O campo PID (Identificação do pacote)
é composto igualmente por 8 bits, em que 4 destes bits determinam o tipo da
informação, e os restantes 4 bits servem para verificação dos dados.
- O campo de endereço.
- O campo de endpoint com 4 bits, que
indica qual o endpoint que envia ou recebe o pacote.
- Um campo de dados, que pode ir de 0
(zero) até 1023 bytes.
A detecção de erros é feita usando um
CRC (Cyclic Redundancy Check) em todos os campos, excepto no PID, que tem o seu
próprio mecanismo de verificação. O CRC é considerado quase 100% eficiente na
detecção de erros.