Estudos USB
|
Quarta-feira - 17/04/2013
-Tentativas de enviar sinal pra a porta através do código C da biblioteca "hidapi.h"
-Git - http://fabio-fernandes.com/blog/instalando-e-usando-o-git-no-ubuntu/
-Instalei o programa VB (cedido pela Cerne) no linux(Ubuntu 12.04), através do Wine, porém ele nao funcionou como ja tinha funcionado no Windows.
(Estive pensando se o problema seria no linux ou no Wine, pois talvez o wine nao ofereça a comunicaçao necessária ao programa, ou até nao sei se a instalaçao no Wine é 100% equivalente a instalaçao diretamente no Windows)
-Leitura de documentos sobre o Pic 18F2550 (18f2550.h)
OBS: Fiquei com dúvida se isso pode servir nesse projeto, pois muitos falam em gravação do microcontrolador. E nao sei se a gravaçao nos interessa.
http://www.vivaolinux.com.br/artigo/Gravacao-de-microcontroladores-PIC-via-USB-pelo-terminal-do-Linux
"Para que os programas em C possam ser gravados no microcontrolador via USB, é necessário compilá-los, ou seja, transformá-los em linguagem de máquina hexadecimal.
Existem diversos compiladores que podem ser utilizados por esta ferramenta, entre eles o SDCC, o C18, o Hi-Tech e o CCS"
http://www.cerne-tec.com.br/artigousbparte2.pdf
http://burningsmell.org/pic18f2550/
http://www.eletrica.ufpr.br/ufpr2/tccs/150.pdf
Sexta-feira 19/04/2013
Leituras sobre USB
Links interessantes:
http://www.infowester.com/usb.php
http://www.infowester.com/usb30.php
http://computer.howstuffworks.com/usb1.htm
Segunda-feira 22/04/2013 e terça-feira
Leituras USB:
Capitulo 13 do livro "linux device drivers"
http://bbs.dianyuan.com/bbs/u/34/1129334558.pdf
http://www.beyondlogic.org/usbnutshell/usb1.shtml
http://www.freebsd.org/doc/en/books/arch-handbook/usb-dev.html
citações interessantes:
"Endpoints are the unidirectional access points for communicating with a device. They provide buffers to temporarily store incoming or outgoing data from the device."
Endpoint do tipo interrupt :"Interrupt endpoints transfer small amounts of data at a fixed rate every time the USB host asks the device for data. These endpoints are the primary transport
method for USB keyboards and mice. They are also commonly used to send data
to USB devices to control the device, but are not generally used to transfer large
amounts of data. These transfers are guaranteed by the USB protocol to always
have enough reserved bandwidth to make it through."
http://www.beyondlogic.org/usbnutshell/usb4.shtml#Interrupt
"A device interface is a collection of endpoints. For example USB speakers can have an interface for the audio data (Audio Class) and an interface for the knobs, dials and buttons (HID Class). All interfaces in a configuration are active at the same time and can be attached to by different drivers."
"USB interfaces are themselves bundled up into configurations [...]So to summarize, USB devices are quite complex and are made up of lots of different
logical units. The relationships among these units can be simply described as follows:
• Devices usually have one or more configurations.
• Configurations often have one or more interfaces.
• Interfaces usually have one or more settings.
• Interfaces have zero or more endpoints."
prints do software, para windows, que analiza a comunicaçao USB
https://lh6.googleusercontent.com/epD232KXyedfyV2r_7LLZRQ70bn9gEWPXBxrKLuuMv2gZoexTtcoc_bstDvj-Jg-VA=w1600
https://lh4.googleusercontent.com/f1GPV21XYjF0ZOaL4gIda5OK2CZGP9H1ifx9bDMBSMv-Yrnbybi7YZmMalHCmVRW6Q=w1600
https://lh4.googleusercontent.com/eC1tw7vsLzk0OYylqKx1iYxqdE6O86c-IleXmCCqpbiwDn34FylNniG_Pw9K67wG7g=w1600
documentos com algumas informaçoes que estão auxiliando no estudo da comunicaçao entre host e o device USB:
https://docs.google.com/document/d/1-y3Ze_V60gTRnhb7FxVc1gmjkX2RaLGmtfopfyV2-d0/edit (ultima atualizaçao no dia 05/05/2013)
leitura complementar sobre URBs
http://www.makelinux.net/ldd3/chp-13-sect-3
Domingo 5/5/2013
instalaçõ do GCC no windows
http://www.franciscosouza.com.br/2009/04/07/instalando-um-compilador-cc-no-windows/
|
Comunicão em C com a placa de aquisição de dados
|
Primeira comunicação feita com sucesso utilizando a linguagem C
Para rodar o programa leia otutorial
Tutorial de conexão e comunicação com a placa de aquisição de dados
O primeiro passo para conseguir se conectar à placa de aquisição de dados, utilizando a liguagem C é fazer todas a configurações necessárias para conseguir compilar o programa utilizando a biblioteca HID.
Links úteis:
Link principal para a biblioteca: http://www.signal11.us/oss/hidapi/
Read-me com explicações mais detalhadas sobre as configurações abaixo: https://docs.google.com/document/d/1LsqJdvBf6gg5KQLJULJwQus9NVtZsaCNOQudspGmFLs/edit
Página de downloads: https://github.com/signal11/hidapi/downloads
1 - Baixe o pacote com os arquivos necessários:
https://github.com/downloads/signal11/hidapi/hidapi-0.7.0.zip
2 - Instale o pacote Libusb 1.0
- sudo apt-get install libusb-1.0-0-dev
3 - Instale o pacote Libudev (cabeçalho e biblioteca)
- sudo apt-get install libudev-dev
4 - Descompacte o arquivo .zip hidapi-0.7.0.zip baixado no passo 1. Você pode fazer isso manualmente, ou no terminal:
No meu caso o arquivo está na pasta Downloads:
- cd ~/Downloads
E então:
- unzip -a hidapi-0.7.0.zip
5 - entre em hidapi-0.7.0 hidapi-0.7.0/hidapi/ e copie ou mova o arquivo hidapi.h para a pasta linux: (manualmente, ou pelo terminal)
#cd hidapi-0.7.0/hidapi/
E então
- mv hidapi.h ../linux/
6 - após descompactar, entre na pasta hidapi-0.7.0/linux e faça o comando make
- cd hidapi-0.7.0/linux/
- make
7 - Crie um documento com o código C abaixo salve-o dentro do diretório linux:
Código
~/Downloads/hidapi-0.7.0/linux):
8 - Compile o programa: (certifique-se que você esta dentro do diretório “linux” (~/Downloads/hidapi-0.7.0/linux))
gcc prog.c hid-libusb.o `pkg-config libusb-1.0 libudev --libs` -o prog
9 - Rode o programa:
sudo ./prog
|
Configuração em versões anteriores a 12.04
|
- Ao entrar no diretório drivers (/sys/bus/usb/drivers) é possível ver todos os driver que estão sendo utilizados no momento no PC;
- para a plaquinha, o objetivo é usar o driver usbtouchscreen. Para ver se este driver existe na versão do ubuntu sendo utilizada:
modinfo usbtouchscreen
- Para ver todos os driver instalados no PC basta acessar /lib/modules/3.0.0-12-generic/kernel/drivers/
(OBS: pode ser que tenha que mudar a versão ali onde no meu ubuntu (11.10) mostra 3.0.0-12-generic, mas como só existe um diretório dentro do modules, fica fácil)
- Quando conectado, automaticamente o PC bota o driver USBHID, temos que tirar ele, com o unbind:
echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbhid/unbind
OBS: achei o endereço "1-4.4:1.0" dentro do diretório usbhid com o comando ls (esse endereço talvez varie de PC para PC)
e para botar a plaquinha no usbtouchscreen temos que levantar o driver usbtouchscreen:
modprobe usbtouchscreen
e entao:
echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbtouchscreen/bind
- Após fazer isso, verifique se funcionou, desconectando e conectando a plaquinha do PC e utilizando o comando dmesg;
pode ser que não funcione de primeira, acredito que os drivers fiquem ``brigando``, então eu fiz a seguinte ordem de comandos:
rmmod usbhid
modprobe usbtouchscreen
echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbhid/unbind
modprobe usbhid
echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbtouchscreen/bind
modprobe usbhid
ATENÇÃO: tive que fazer o comando rmmod USBHID para que a plaquinha nao tivesse nenhuma chance de conectar nesse driver, porem isso fez com que meu mouse USB parasse de funcionar, para ele voltar a funcionar tive que fazer modprobe USBHID no final, resolvendo meu problema. Mas isso é um problema nos computadores que usam mouse e teclado usb, pois quando o comando rmmode for dado, eles serão desconectados, a soluçao é escrever esses comandos, em lista, como fiz acima, e colá-los todos juntos no terminal, fazendo com que o terminal execute todos de uma vez, ou criar um arquivo .sh
Após essas configurações,desconectando e conectando a plaquinha e utilizando o comando dmesg,ja deve ser possível ver que ela esta utilizando "input..." e nao mais "generic-usb..."
link interessante:Adding new vendor and product IDs to an existing USB driver on Linux
- su
- modprobe usbtouchscreen echo 1234 0001 > /sys/bus/usb/drivers/usbtouchscreen/new_id
|
Pontos a serem verificados
- Versão e drivers do linux que estão sendo usados;
modinfo usbtouchscreen >
usbtouchscreen
usbtouchscreen
modinfo input >
input
- Fazer um teste no Redes II e Inf para verificar se placa funciona (falar com Ricardo - ricardo.ifsc@gmail.com );
- Documentar o driver da usb que está sendo usado (input) e verificar como trocar o driver dinamicamente para testar em outros PC;
- Testar as entradas e saídas analógicas;
Saída: modificar a função enviar():
buf[0] = 'D';
buf[1] = '1';
buf[2] = '2';
buf[3] = '5';
buf[4] = '5';
res = hid_write(handle, &buf[0], 5);
Onde 1 é o numero da saída e 255 representa 5V
127 = 2,5V
0 = 0V e assim por diante.
- Especificar a "biblioteca" a ser disponibilizada para os alunos;
- estudar como construir uma biblioteca no Linux (lib ver [1]);
- testes de desempenho
- Biblioteca em C e Código .sh para conectar corretamente a plaquinha ao driver
Biblioteca em C para programção
|
Todos os arquivos utilizados neste tópico podem ser baixados aqui (LINK1):
Os passos para criar esta biblioteca estão melhores explicados neste link. Para esta biblioteca em particular, foram utilizados 3 arquivos.o (que podem ser baixados no LINK1), são eles:
prog.o (contém as funções da biblioteca feita para a disciplina de programação e também a biblioteca Hidapi;
hid-libusb.o (contém a biblioteca hid-libusb);
libusb.o (contém a biblioteca libusb);
Estes arquivos foram então colocados dentro do arquivo "bibprg.a"
Para utilizar a plaquinha então, é necessário ter o arquivo bibprg.a, e do arquivo bibprg.h que terá que ser utilizado como cabeçalho em todos os códigos que usem a biblioteca bibprg
|
Rodando programas em C
1: fazer o download da biblioteca: (upar no google docs
Passo 1a:
Versões em que o driver sendo utilizado pelo pc é o usbhid:
OBS: O driver pode ser visto com o comando usb-devices (procurando pelo device com nome: Cerne Tec)
com o comando dmesg é possivel ver outro "erro", a saída correta para este comando deve ser "input: Cerne..." e nao "Generic-USB..."
Se o driver sendo utilizado é o usbhid (generic-usb), siga os passos abaixo:
- Descompacte a pasta biblioteca;
- Entre no diretório biblioteca;
- Como root, execute o arquivo .sh (MELHORAR para nao precisar ser root)
ATENÇÃO: não adianta seguir em frente se o driver ainda nao foi reconhecido corretamente, confirme isso conectando
(ou tirando e reconectando a placa) e entao com o comando dmesg: veja se existe esta linha:
input: Cerne Tec...
se nao, repita o passo 1a.
Passo2:
2 - Instale o pacote Libusb 1.0
- sudo apt-get install libusb-1.0-0-dev
3 - Instale o pacote Libudev (cabeçalho e biblioteca)
- sudo apt-get install libudev-dev
4 - Existem 2 programas para testes, eles podem ser compilados:
gcc ptest.c libprg.a -lusb-1.0 -o teste
e
gcc analo.c libprg.a -lusb-1.0 -o analogic
OBS: Caso o seu sistema seja 64bits, utilize no lugar de libprg.a a bibprg.a
Botar o script shell pra rodar ja no boot; (Feito no meu PC pessoal, testarei no IFSC);
Mudar a permissão de acesso a plaquinha (feito com chmod); construir uma regra udev;
"Mais uma dica é que, normalmente, novos dispositivos são criados com permissão de escrita somente para o root, até que você as modifique manualmente, usando o comando "chmod". O udev permite ajustar as permissões, modificando o dono, grupo e permissões de acesso do dispositivo. Isso pode ser usado para que scanners e outros dispositivos fiquem automaticamente acessíveis para todos os usuários do sistema, evitando dores de cabeça em geral, ou fazer com que um pendrive ou outro dispositivo em particular fique disponível apenas para um determinado usuário, mas não para os demais."[2]
metas -semana
regra UDEV plaquinha; ok
Display (rodar e função); ok
teclado; ok
|