10

3
Figura 1.Estes são os passos que deve-se seguir para criar um arquivo INF para o controlador USB universal. Controlador USB universal Diga adeus aos problemas de interligação O projeto do seu próprio dispositivo USB é uma tarefa interessante para qualquer amador, que tem como seu maior obstáculo o desenvolvimento do controlador do dispositivo para o PC. A complexidade de um software deste gênero é normalmente elevada, suficiente para assustar até o mais experiente dos programadores. Neste artigo apresenta-se um controlador USB universal que consiste numa solução para este problema, com a vantagem de ter o respectivo código fonte gratuito. Michael Odenwald, Michael Keller e Paul Goossens 11 HARDWARE & SOFTWARE

Transcript of 10

Page 1: 10

Figura 1.Estes são os passos que deve-se seguir para criar um arquivo INF para o controlador USB universal.

Controlador USB universal Diga adeus aos problemas de interligaçãoO projeto do seu próprio dispositivo USB é uma tarefa interessante para qualquer amador, que tem como seu maior obstáculo o desenvolvimento do controlador do dispositivo para o PC. A complexidade de um software deste gênero é normalmente elevada, suficiente para assustar até o mais experiente dos programadores. Neste artigo apresenta-se um controlador USB universal que consiste numa solução para este problema, com a vantagem de ter o respectivo código fonte gratuito.

Michael Odenwald, Michael Keller e Paul Goossens

11

Hardware & Software

Controlador USB Universal.indd 11 1/11/08 3:36:14 PM

Page 2: 10

Ao projetar dispositivos USB precisa-se também programar o controlador de dispositivo associado. Para muitos projetistas esta é uma tarefa bastante complicada, que muitos não arriscam fazer. Tudo isso vai agora mudar! Com a ajuda da placa AVR-USB, vamos abordar neste artigo como ultrapassar o problema relacionado com os controladores USB, disponibilizando um controlador de dispositivos USB com o código fonte aberto.

LigaçõesTudo estava perfeito em relação ao hardware da nossa placa AVR-USB até a termos ligado ao PC. O Windows XP pede um controlador de dispositivo, tal como era esperado. Contudo, por enquanto, este ainda não existe para o nosso hardware.Para nos auxiliar existe o libusb-win32, um controlador de dispositivos universal de código fonte aberto [1]. Este tem a forma de uma DLL e permite ao Windows comunicar diretamente com o dispositivo. Podemos, desta forma, processar o fluxo de dados numa aplicação Windows, sem que haja necessidade de escrever um controlador especialmente para o nosso dispositivo. Ao contrário dos controladores de dispositivos comuns, o libusb-win32 permite usar uma API (Application Programming Interface) do Windows em vez do mecanismo IOCTL (Input/Output ConTroL).

Passar à açãoEm primeiro lugar, deve-se baixar o arquivo libusb-win32 e extrair todos os seus arquivos do ZIP para uma pasta dedicada. Antes de poder usar este controlador, deve-se começar por criar um arquivo INF. Este arquivo indica ao Windows que controlador corresponde a que dispositivo. A criação deste arquivo INF torna-se muito fácil se usar um programa incluído na libusb-win32, designado por inf-wizard.exe. O arquivo INF é criado da seguinte forma: alimente a placa AVR-USB e ligue-a ao PC. O Windows pede em seguida um controlador. Pressionar em ‘Cancelar’ e execute o programa inf-wizard.exe. Na primeira janela clique em ‘Next’. Aparece em seguida uma segunda janela, que contém uma lista de todos os dispositivos USB ligados ao PC. Selecione a sua placa AVR-USB, com um VendorID igual a 0x0C7D e um ProductID igual a 0x0006; e clique novamente em ‘Next’. O programa indica em seguida que gerou um arquivo INF e um arquivo CAT. Clique em ‘Finish’ para fechar o programa (Figura 1).

Teste inicialDeve-se agora desligar a placa AVR do PC e voltar a ligá-la. O Windows pede novamente um controlador. Desta vez escolha a opção ‘Especificar uma localização’ e navegue até o arquivo INF gerado com o inf-wizard.exe.Se tudo correr conforme planejado, o Windows instala o controlador do dispositivo. Agora deve ser possível encontrar a placa AVR-USB no Gerenciador de Dispositivos do Windows.

AplicaçõesPode-se agora usar a placa AVR-USB nas suas aplicações. No site da Elektor existem alguns arquivos para este projeto, que contêm várias aplicações (sempre com o código fonte incluído) para controlar a placa AVR-USB. Estas aplicações foram escritas em C e .NET, entre outras linguagens. Pode-se usar este código fonte como base para as suas próprias aplicações. O teste das funcionalidades da placa AVR-USB é muito fácil com o programa ‘AVR-USB-Windows1.exe’, que permite testar todas

as capacidades de E/S do hardware.

Código fontePara ter uma idéia de como pode controlar o seu dispositivo USB a partir de uma aplicação, vamos analisar algumas seções do código.Na Listagem 1 pode-se ver como a aplicação procura por um dispositivo USB concreto. Se esse dispositivo for encontrado, inicia-se a comunicação com esse mesmo dispositivo. Num ciclo ‘for-next’ todos os barramentos USB disponíveis são interrogados, sendo requisitados o ‘VendorID’ e ‘ProductID’ de cada dispositivo ligado no barramento. Quanto ambos os campos tiverem o valor pretendido, o programa tenta abrir o dispositivo em questão. A referência (handle) para esse dispositivo é armazenada na variável global ‘usb_dev_handle’. O passo final é a configuração

Listagem 1Globale variabele:usb_dev_handle *usbIODevice; /* The usb device handle */

Funktie:

int searchUSBDevice(int vendorID, int productID){ struct usb_bus *busses; struct usb_bus *bus; struct usb_device *dev;

if (usbIODevice != NULL) { usb_close(usbIODevice); }

usbIODevice=NULL;

/* Find the device for the given vendorID and productID*/ usb_init(); usb_find_busses(); usb_find_devices(); busses = usb_get_busses();

for (bus=busses; bus; bus=bus->next) { for (dev=bus->devices; dev; dev=dev->next) { if (dev->descriptor.idVendor == vendorID && dev->descriptor.idProduct == productID) { usbIODevice=usb_open(dev); if(usb_set_configuration(usbIODevice, 1)) return 0; if(usb_claim_interface(usbIODevice, 0)) return 0; return 1; } } } return 0;}

12

Hardware & Software

Controlador USB Universal.indd 12 1/11/08 3:36:14 PM

Page 3: 10

do dispositivo de acordo com a norma USB e a reserva de direitos exclusivos ao uso do dispositivo.Se não ocorrerem erros inesperados, a função retorna o valor ‘1’ para indicar que tudo correu bem. Caso contrário, retorna o valor ‘0’.

Controle de hardwareControlar o hardware é bastante simples. Na Listagem 2 pode ver como o estado das entradas digitais é lido. Aqui assume-se que a função ‘searchUSBdevice’ da Listagem 1 foi previamente invocada para atribuir uma referência válida a ‘usb_dev_handle’. Com a ajuda da função ‘sendUSBVendorCmdln’ envia-se o comando ‘AVR_USB_READ_DIGITAL’, que dá ordem de leitura de um valor digital e indica também (segundo parâmetro) qual a porta do qual se pretende ler esse valor. O resultado é colocado na matriz ‘iodata’, que a aplicação pode usar para determinar

o estado das entradas digitais relevantes. Este mesmo comando pode também ser encontrado no código fonte do firmware.

Teste A melhor forma de se familiarizar com o software é experimentar os exemplos um a um. Os exemplos avr-usb1 a avr-usb4 podem ser obtidos no site da Elektor (060276-11.zip) e compilados usando o GCC [2]. Os demais exemplos foram escritos em C#.Com os vários exemplos disponíveis, vai certamente conseguir escrever aplicações para a sua placa AVR USB em outros ambientes de desenvolvimento em Windows.

Finalmente Para trocar idéias ou obter auxílio pode-se consultar o fórum de discussão do controlador universal [3]. Neste site irá encontrar muitos programadores que disponibilizam informação útil, e pode também colocar as suas próprias questões. Pode também consultar o nosso fórum da Elektor (www.elektorbrasil.com.br) para compartilhar experiências com outros leitores. Aqui irá certamente encontrar outros projetistas de eletrônica que farão interessantes contribuições para este projeto e que por sua vez vão estar interessados nas suas experiências.

(060226-1)

Artigo original: Universal USB Device – March 2007

Internet[1] http://libusb-win32.sourceforge.net/

[2] http://gcc.gnu.org

[3] http://sourceforge.net/forum/?group_id=78138

Listagem 2int digiportTest(void){ int i; int result; unsigned char iodata[8];

printf(“digiport: AVR-USB get value from digital input Port:\n\r”);

for (i=0; i<=1000; i++) { if((result = sendUSBVendorCmdIn( AVR_USB_READ_DIGITAL, AVR_USB_DIGITAL_P1, 0, iodata, 8)) < 0) printf(„Error sendUSBVendorCmd %d“, result); printf(„digital in status P1 is %s\n\r“, (iodata[0]) ? „close“ : „open“); if((result = sendUSBVendorCmdIn( AVR_USB_READ_DIGITAL, AVR_USB_DIGITAL_P2, 0, iodata, 8)) < 0) printf(„Error sendUSBVendorCmd %d“, result); printf(„digital in status P2 is %s\n\r“, (iodata[0]) ? „close“ : „open“); if((result = sendUSBVendorCmdIn( AVR_USB_READ_DIGITAL, AVR_USB_DIGITAL_P3, 0, iodata, 8)) < 0) printf(„Error sendUSBVendorCmd %d“, result); printf(„digital in status P3 is %s\n\r“, (iodata[0]) ? „close“ : „open“); if((result = sendUSBVendorCmdIn( AVR_USB_READ_DIGITAL, AVR_USB_DIGITAL_P4, 0, iodata, 8)) < 0) printf(„Error sendUSBVendorCmd %d“, result); printf(„digital in status P4 is %s\n\r“, (iodata[0]) ? „close“ : „open“); Sleep(500); } return 0;}

13

Hardware & Software

Controlador USB Universal.indd 13 1/11/08 3:36:14 PM