Os dispositivos USB são muito mais complexos do que simplesmente canos que você lê e escreve. Você terá que escrever código para manipulá-los. Você não precisa escrever um driver de kernel. Veja link (née libusb.org) e link . Isso alega trabalhar com Linux, Mac OS X, Windows, Android, OpenBSD, etc. No Mac OS X, existem funções no nível do usuário em Kit I / O que permite acessar o USB.
Aqui está um pequeno diagrama que eu desenhei uma vez para me ajudar a entender a arquitetura do USB:
╭──────────────────────────────────────╮
┌──────┐ │ device ┌─────┐ ┌───────────┐ │
│ Port ├──┐ │ ┌─┤ EP0 ├──┤ control │ │
└──────┘ │ │ ┌────────┐ │ └─────┘ │┌─────────┐│ │
├────┤addr = 2├─┤ ┌─────┐ ││ ││ │
│ │ └────────┘ ├─┤ EP1 ├──┼┤interface││ │
│ │ │ └─────┘ ││ #0 ││ │
│ │ │ ┌─────┐ │├─────────┤│ │
│ │ ├─┤ EP2 ├──┼┤ ││ │
│ │ │ └─────┘ ││interface││ │
│ │ │ ┌─────┐ ││ #1 ││ │
│ │ └─┤ EP2 ├──┼┤ ││ │
│ │ └─────┘ │└─────────┘│ │
│ │ └───────────┘ │
│ ╰──────────────────────────────────────╯
│
│
:
Resumo executivo: cada dispositivo tem um endereço (atribuído pelo O / S e sujeito a alterações) e até (eu acho) 32 pontos de extremidade.
Dentro do dispositivo há uma ou mais "interfaces". Por exemplo, uma web cam pode fornecer uma interface de "câmera" e uma interface de "microfone". Uma impressora multifuncional forneceria várias interfaces.
O endpoint 0 é usado para controlar e configurar o dispositivo, e os outros devem acessar as várias interfaces. Cada interface tem zero ou mais (geralmente mais) pontos de extremidade.
Os pontos de extremidade podem ser um dos vários tipos de transferência:
- Transferências de controle são usadas para configurar o dispositivo. Cada dispositivo é necessário para suportar um conjunto mínimo de instruções de controle.
- Transferências em massa enviam ou recebem dados em largura de banda total
- Interrompe as transferências (não sei ao certo como isso é diferente das transferências em bloco; o USB não tem interrupções). Exemplos incluem teclado e mouse
- As transferências isócronas enviam ou recebem dados em largura de banda total com requisitos em tempo real, mas sem confiabilidade. Usado para aplicativos de áudio / vídeo.
Também vale a pena notar: um dispositivo USB pode ter várias configurações, que controlam quais interfaces estão disponíveis e assim por diante.
Todas essas informações são apresentadas em descritores de dispositivos, descritores de configuração, descritores de interface, descritores de endpoint, etc., que podem ser consultados por meio do terminal zero.
Por fim, os dados não são um fluxo de bytes, são agrupados em pacotes, cujos formatos exatos fazem parte da especificação USB. A boa notícia é que o libusb ou o kit de E / S gerenciarão essa parte para você.
Mais informações: "Function" é uma coleção de interfaces que funcionam juntas. Não é originalmente parte da especificação USB, e cabe ao driver de dispositivo saber quais interfaces devem ser agrupadas. O Grupo de Trabalho USB definiu classes de dispositivos que suportam funções. Isso é feito através do Descritor de Associação de Interface (IAD).