Saiba como construir um dispositivo USB

Nas últimas semanas, tenho construído um dispositivo USB usando um PIC18F2550. Desta vez, quis me envolver em uma discussão com o host de software. Afinal, se você construir um dispositivo USB, é lógico que irá querer usá-lo de algum software de computador, certo? Se você criou algo que se parece com um dispositivo padrão (por exemplo, um mouse), então isso é fácil. É só você tratá-lo como faria com qualquer outro mouse.

No entanto, é mais simples e mais flexível  construir uma HID (Human Interface Device, ou em tradução livre, dispositivo de interface humana). E foi isso que eu fiz. É verdade que um mouse (e teclado) é uma HID. Mas nem todos os HIDs agem como dispositivos de entrada padrão.

Você poderia escrever um driver USB completo, mas isso dá muito trabalho. Sem mencionar que seria necessário escrever um driver novo para cada sistema operacional. Isso é parte da beleza de usar o projeto HID: todos os principais sistemas operacionais já têm um driver para isso. Seu trabalho é interagir com eles a partir do software de usuário simples-para-escrever.

Existem algumas opções. A biblioteca libusb é muito flexível, mas também é um pouco complexa para trabalhar quando você não precisa de todas as suas capacidades. Além disso, o suporte do Windows foi limitado recentemente.

A outra opção usar a biblioteca HIDAPI. Isso fornece uma interface uniforme entre Linux, Mac e Windows por meio de back-ends diferentes. Primeiro, queria escrever uma interface de linha de comando simples para provar que eu poderia falar com o dispositivo.

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#include <stdio.h> 

#include “hidapi.h”

 

int main(int argc, char *argv[])

{

int state=0;

float v;

 

unsigned char buf[65];

hid_device *handle;

if (hid_init()) return;

printf(“Hid init\n”);

handle=hid_open(0x4d8,0xf83f,NULL);   // our PID

if (!handle) return;

printf(“Hid opened\n”);

buf[0]=0;   // send a command

buf[1]=1;

buf[2]=1;

int rv1=hid_write(handle,buf,3);

printf(“Write returned %x\n”,rv1);

buf[0]=0;   // send a read command

buf[1]=2;

hid_write(handle,buf,2);

hid_read(handle,buf,sizeof(buf));  // read data back

v=(buf[3]<<8|buf[2])*5/1024.0;  // convert to voltage

printf(“Voltage=%f\n”,v);

buf[0]=0;

buf[1]=1;

buf[2]=0;

hid_write(handle,buf,3);

hid_close(handle);

hid_exit();

}

Não é muito excitante, mas fácil de seguir. A função hid_init configura a biblioteca enquanto a chamada thehid_open abre o meu dispositivo específico. O hid_read,hid_write e comandos hid_close fazem o que você acha que eles fazem. Finalmente, o hid_exit limpa e nada fica para trás.

Muito simples. Claro, você pode fazer muito mais, mas o código desta série irá permitir que você faça uma quantidade surpreendente de desenvolvimento USB com um mínimo de barulho.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: