O Libusb é uma biblioteca para interagir com dispositivos USB da mesma maneira que a maldição é uma biblioteca para interagir com terminais de texto, o ALSA (mais precisamente seu componente libasound) é uma biblioteca para interagir com dispositivos audi, etc. O kernel lida com as interações de hardware. Ele fornece arquivos de dispositivos que as aplicações podem abrir para interagir com o hardware, através read, writee chamadas do sistema .ioctl
ioctl é uma chamada de sistema: permite que aplicativos (código no nível do usuário) emitam solicitações que são processos pelo kernel.
O Libusb permite que os aplicativos registrem funções de retorno de chamada que são executadas quando o dispositivo tem algo a relatar. Aqui está uma visão geral aproximada do fluxo de informações sob o capô:
O sinal elétrico no barramento dispara um evento no controlador USB.
O controlador USB gera um sinal de interrupção no processador principal.
O processador executa o manipulador de interrupção no kernel do sistema operacional.
Os avisos do kernel que um processo está atualmente em um bloqueio read, writeou ioctlchamada de sistema no arquivo de dispositivo e faz com que a chamada de sistema para retornar.
No processo de aterrissagem do usuário, quando a chamada do sistema retorna, o código da biblioteca é executado.
O código da biblioteca executa a função de retorno de chamada registrada pelo programador do aplicativo.
então não há necessidade de escrever drivers de dispositivo para dispositivos USB? (a não ser talvez para otimização de velocidade)
Thomas
@ Thomas Você precisa escrever um driver do kernel se quiser conectar-se a uma estrutura independente de transporte: teclado, armazenamento, ethernet etc. Caso contrário, acho que você só precisará de um driver se a latência de um programa da terra do usuário for muito alta.
Gilles 'SO- stop be evil'
Se um dispositivo não for reconhecido pelo computador (não há driver para ele), libusbainda será possível acessá-lo?
Thomas
@ Thomas Eu não sei se o libusb pode lidar com todos os aspectos do protocolo USB, mas, em princípio, sim. Um programa de usuário pode se comunicar com qualquer dispositivo serial RS232, via /dev/ttyS*. USB é o mesmo princípio, apenas mais rápido e mais complexo.
Gilles 'SO- stop be evil'
3
O Linux usa dois anéis, anel 0 é chamado de nível de kernel, anel 3 é chamado de nível de usuário. A conexão do usuário ao kernel é feita (como já foi dito) via syscalls. Entre eles estão as bibliotecas, como podem ser vistas na terra do usuário. Portanto, o acesso de nível mais baixo ao kernel é implementado nas bibliotecas, por motivos de estabilidade, segurança, sincronização, economia de espaço, etc. O driver do kernel fornece interfaces diferentes para a terra do usuário: (ioctl, sysfs, soquetes, dispositivos de caracteres e blocos e assim por diante) Interfaces de espaço do usuário . Portanto, se desejar, você pode implementar seu acesso ao driver do kernel omitindo as bibliotecas ou compilar muito mais facilmente seu binário com bibliotecas vinculadas estáticas.
Um bom ponto de partida é ler as fontes do libusb, elas estão bem documentadas.
Então, tudo funciona como se o kernel fizesse um driver especial para dispositivos desconhecidos que aceitassem leituras e gravações? Como somos notificados de interrupções e assim por diante?
libusb
ainda será possível acessá-lo?/dev/ttyS*
. USB é o mesmo princípio, apenas mais rápido e mais complexo.O Linux usa dois anéis, anel 0 é chamado de nível de kernel, anel 3 é chamado de nível de usuário. A conexão do usuário ao kernel é feita (como já foi dito) via syscalls. Entre eles estão as bibliotecas, como podem ser vistas na terra do usuário. Portanto, o acesso de nível mais baixo ao kernel é implementado nas bibliotecas, por motivos de estabilidade, segurança, sincronização, economia de espaço, etc. O driver do kernel fornece interfaces diferentes para a terra do usuário: (ioctl, sysfs, soquetes, dispositivos de caracteres e blocos e assim por diante) Interfaces de espaço do usuário . Portanto, se desejar, você pode implementar seu acesso ao driver do kernel omitindo as bibliotecas ou compilar muito mais facilmente seu binário com bibliotecas vinculadas estáticas.
Um bom ponto de partida é ler as fontes do libusb, elas estão bem documentadas.
fonte
Ele usa syscalls (2) e arquivos de dispositivo preparados pelo kernel (
/dev/bus/usb/*
)fonte