Acessar o Hardware com C\C++

1,875 views
Skip to first unread message

Lucas Nunes

unread,
Apr 17, 2011, 3:19:42 PM4/17/11
to ccppbrasil
Olá!

Gostaria de saber como faço para acessar o hardware do PC (as portas
de I\O) usando C\C++.
Pelo que pesquisei isso depende muito do SO, que no caso estou usando
Windows.
Preciso saber sobre isso, pois vou precisar para um trabalho.

Por exemplo, como leio o que entrada em uma das minhas portas USB?
Usando o stdios dá para ter acesso ao teclado no máximo. Mas eu não
entendo como isso ocorre.
Se segue algum protocolo e etc.

Alguém pode me guiar nesse caminho? Indicam-me algum livro, tutorial
ou outra coisa?

Aproveitando, alguém conhece algum tutorial ou livro bom sobre
Assembly inline (eu sei que é quase a mesma coisa que só o ASM, mas de
preferência o inline), pois acho que isso será útil.

P.S: Eu tenho um bom conhecimento de C\C++ e esse conhecimento de
hardware e baixo nível me serão muito útil (não, não é criar vírus nem
malwares ^^").

Desde já agradeço.

Marcos Carlos

unread,
Apr 17, 2011, 7:33:27 PM4/17/11
to ccppb...@googlegroups.com
Boa Noite Lucas,


     O que vc vai querer da USB? Eu nunca fiz uso disso em c++, sempre que precisei fazer uso disso o fabricante fornece geralmente uma DLL pra vc fazer o acesso ao hardware dele. O que vc vai controlar especificamente?
http://en.wikibooks.org/wiki/Windows_Programming/Device_Driver_Introduction

[]s
Marcos
   

--
Antes de enviar um e-mail para o grupo leia:
                    http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
             para Eventos do Grupo C & C++ Brasil:
                       http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira:  vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en



--
Marcos de Lima Carlos
mail to: mlima...@gmail.com
http://www.sirandsir.com - Novo Conteúdo!


Lucas Nunes de Lima

unread,
Apr 17, 2011, 9:29:55 PM4/17/11
to ccppb...@googlegroups.com
É justamente isso que quero saber. Não necessariamente quero saber sobre USB.
Eu sei que existem programas para quase tudo hoje. Programas para gravar audio, reproduzir áudio, vídeo e etc.
Eu sei como exebir um vídeo, reproduzir o aúdio, gravar um arquivo no HD e etc.
Mas, se eu preciso desenvolver um programa que capte o audio do microfone do PC, ou reproduzir.
Normalmente, nós só temos dlls que façam isso. Mas, como eu faço isso no braço mesmo?
Como eu faço um driver? Como eu verifico que uma tecla está pressionada sem usar uma das bibliotecas do C\C++?

Mas, estou interessado no USB pois sei que me será útil.
Inicialmente, eu queria saber como receber o buffer de leitura do USB.

---
To conferindo o link que você me passou.
Vlw!

Marcos Carlos

unread,
Apr 17, 2011, 11:15:37 PM4/17/11
to ccppb...@googlegroups.com
Em qual sistema operacional vc deseja o controle do USB? Eu não costumo fazer essas coisas no braço por dois motivos:

1. Tempo.
2. Geralmente o código do fabricante é mto, mas mto melhor do que o meu. Eu tive essa triste decepção.

No windows vc vai ter que dar uma lida na API pra ver como vc faz isso.
No linux/unix eu nunca fiz, mas sei que existem bibliotecas prontas.

Pra fazer um driver no windows é um pouco complicado. Têm gente aqui mto mais qualificada do que eu pra te ensinar. Todos os acessos que eu precisei fazer entre o sistema operacional pela USB eu usei o fornecido pelo fabricante ou fiz por HID. Geralmente eles te fornecem funções pra acessar o dispositivo deles.

Para o caso da tecla eu nunca fiz isso, mas quando vc baixa mto o nível da programação tentando chegar no hardware, principalmente no windows, começa a ter muitas variáveis que tornam o seu código complicado pra escrever em tão baixo nível. Provalvelmente deve ter uma chamada de sistema que fique monitorando o teclado e isso tb vc vai encontrar na api do windows (se for windows) e no linux como dois tratamentos diferentes. Não sei se tem como burlar os tratamentos do kernel pq vc começa a entrar na parte protegida do sistema operacional. Aí tb vai variar em como o sistema reconhece o teclado. Se ele é PS2, USB, DIMM.O sistema operacional faz um tratamento e deixa vc ver o teclado como se fosse um acesso ao teclado apenas.  Mas se fosse em MS-DOS vc só precisaria ficar monitorando o buffer do teclado considerando que ele fosse dimm. 

A situação é mais ou menos assim:
O teclado tem um buffer de teclas (não sei te falar de qtas teclas é) e o sistema monitora esse buffer. Qdo vc pressiona uma tecla o teclado continua fazendo uma varredura de tempos em tempos pra saber se a tecla está pressionada. Vamos supor aqui que ele faz varreduras a cada 1ms. Quando vc solta a tecla ele não vê a tecla como pressionada e deixa de alimentar o buffer com essa tecla.

Thiago A. Corrêa

unread,
Apr 18, 2011, 12:46:31 AM4/18/11
to ccppb...@googlegroups.com
Olá,

2011/4/17 Lucas Nunes <lucas...@gmail.com>:


>
> Gostaria de saber como faço para acessar o hardware do PC (as portas
> de I\O) usando C\C++.

Para qualquer sistema operacional moderno, vc vai precisar de um
driver. Se quiser uma explicação detalhada do porque, veja livros de
teoria de sistemas operacionais e também os manuais da Intel sobre os
Rings de execução.

>
> Por exemplo, como leio o que entrada em uma das minhas portas USB?
> Usando o stdios dá para ter acesso ao teclado no máximo. Mas eu não
> entendo como isso ocorre.
> Se segue algum protocolo e etc.

Sim, USB é um stack, assim como rede, cada camada tem uma
responsabilidade. Se vc quer acessar especificamente USB (e não,
digamos uma porta paralela), então sugiro que dê uma olhada no libusb.
(google)

Att.
Thiago A. Correa

Rodrigo Madera

unread,
Apr 18, 2011, 6:40:31 AM4/18/11
to ccppb...@googlegroups.com
Lucas,

Dá uma olhada no site:


Ele fala sobre drivers, e o cara que escreve é muito detalhista, tirando o fato que USB é uma área que ele domina.

Saudações,
Mx

2011/4/17 Lucas Nunes <lucas...@gmail.com>

Lucas Nunes de Lima

unread,
Apr 18, 2011, 7:33:33 AM4/18/11
to ccppb...@googlegroups.com
Obrigado, Pessoal.
Estou conferindo os links e as informações que me passaram.
Vlw!

P.

unread,
Apr 18, 2011, 10:04:28 AM4/18/11
to ccppb...@googlegroups.com
Em domingo, 17 de abril de 2011 22h29min55s UTC-3, Lucas Nunes escreveu:
 
Eu sei como exebir um vídeo, reproduzir o aúdio, gravar um arquivo no HD e etc.Mas, se eu preciso desenvolver um programa que capte o audio do microfone do PC, ou reproduzir.
Normalmente, nós só temos dlls que façam isso. Mas, como eu faço isso no braço mesmo?

Não há mistério neste "fazer no braço".
Você deve fazer basicamente o mesmo que já está fazendo hoje: programar uma interface.

Todo programa se manifesta nos termos de uma interface de programação pré-existente ao próprio programa.
Os programas mais abstratos operam interfaces de programação mais abstratas; os programas menos abstratos operam interfaces de programação menos abstratas.
Mesmo partes em hardware, como uma controladora de vídeo, operam interfaces de hardware, como a interface PCI Express.

Elucidar o mistério de "fazer no braço" é descobrir que interface de programação habilita você a fazer o que quer.
Provavelmente, descer um ou dois níveis de abstração exigirá repensar o que é, exatamente, um programa; uma atividade difícil mas que não será muito mais dífícil do que os primeiros dias de aprendizado do C -- se você ainda se lembra deles.
Em particular, o espaço para "portabilidade" tende a se reduzir quanto mais baixo o programa se coloca, o que tende a doer dependendo do seu hábito anterior.

Com isso em mente, e com um perseverança, você será capaz de navegar em catálogos como esse:


e descobrir a interface certa para o seu problema.

--
 P.

Fernando Roberto

unread,
Apr 18, 2011, 10:29:41 AM4/18/11
to ccppb...@googlegroups.com
Ol� Lucas,

Tudo vai depender um do tipo de interface que o dispositivo que voc�
quer controlar pela porta USB implementa. Afinal, n�o controlamos a
porta em si (como fazemos com portas seriais), mas controlamos os
dispositivos atrav�s dela.

Primeiro de tudo, se seu dispositivo implementa uma interface padr�o,
tal como Mass Storage, Teclado, Mouse. O Windows pode manipular tudo pra
voc�, mas isso n�o elimina a op��o de se ter uma implementa��o
espec�fica do seu dispositivo. Por exemplo: Quero que meu mouse use meu
driver no lugar do driver padr�o.

Se seu dispositivo implementa uma interface customizada, tal como uma
m�quina de desentortar bananas, o Windows n�o ter� um driver para isso e
voc� ter� que implementar por voc� mesmo. Uma interface customizada pode
ser implementada de diversas formas e � o dispositivo quem determina
isso. (verificar com o fabricante e datasheet)

Se seu dispositivo implementa interface HID, que usa endpoint
"interrupt", voc� n�o vai precisar desenvolver nenhum driver. Apenas
usando as rotinas da SetupAPI e manipulando o handle do dispositivo via
ReadFile/WriteFile voc� pode fazer tudo o que precisa. Tudo coisa de
User-Mode sem as dores do Kernel.

Mas se seu dispositivo usa um tipo de endpoint mais r�pido, tal como o
"bulk", voc� pode escolher em desenvolver drivers em User-Mode ou Kernel
mode com o WDF, um framework de desenvolvimento de drivers para Windows.

Seu pior caso ser� se seu dispositivo implementa o endpoint
"isochronous", mais usado em stream de audio e v�deo. Nesse caso voc�
ser� obrigado a escrever um driver em Kernel-Mode e ainda vai esbarrar
nas limita��es do WDF.

WDF � um framework que facilita o desenvolvimento de drivers WDM.
Drivers WDM s�o mais complicados de serem implementados. Facilidade tem
seu pre�o, nesse caso o WDF possui algumas limita��es com rela��o ao
endpoint "Isochronous" e voc� ter� que implementar umas pequenas partes
apoiado em conceitos WDM.

Se voc� � a pessoa que vai desenvolver o firmware que vai rodar na outra
extremidade do cabo, ent�o voc� ter� a liberdade de escolher a interface
a ser implementada, mas caso contr�rio, uma boa documenta��o ser�
suficiente.

Estes s�o excelentes livros a respeito do assunto:

http://www.amazon.com/Developing-Drivers-Windows-Foundation-Developer/dp/0735623740/ref=pd_sim_b_2

http://www.amazon.com/USB-Complete-Developers-Guide-Guides/dp/1931448086/ref=pd_sim_b_4

http://www.amazon.com/Programming-Microsoft-Windows-Driver-Model/dp/0735618038/ref=sr_1_4?s=books&ie=UTF8&qid=1303136600&sr=1-4

Espero ter ajudado.

Um abra�o,
--
Fernando Roberto da Silva
DriverEntry Kernel Development
http://www.driverentry.com.br

On 17/04/11 16:19, Lucas Nunes wrote:
> Ol�!
>
> Gostaria de saber como fa�o para acessar o hardware do PC (as portas


> de I\O) usando C\C++.
> Pelo que pesquisei isso depende muito do SO, que no caso estou usando
> Windows.
> Preciso saber sobre isso, pois vou precisar para um trabalho.
>
> Por exemplo, como leio o que entrada em uma das minhas portas USB?

> Usando o stdios d� para ter acesso ao teclado no m�ximo. Mas eu n�o


> entendo como isso ocorre.
> Se segue algum protocolo e etc.
>

> Algu�m pode me guiar nesse caminho? Indicam-me algum livro, tutorial
> ou outra coisa?
>
> Aproveitando, algu�m conhece algum tutorial ou livro bom sobre
> Assembly inline (eu sei que � quase a mesma coisa que s� o ASM, mas de
> prefer�ncia o inline), pois acho que isso ser� �til.


>
> P.S: Eu tenho um bom conhecimento de C\C++ e esse conhecimento de

> hardware e baixo n�vel me ser�o muito �til (n�o, n�o � criar v�rus nem
> malwares ^^").
>
> Desde j� agrade�o.
>


--
Fernando Roberto da Silva
DriverEntry Kernel Development
http://www.driverentry.com.br

Lucas Nunes de Lima

unread,
Apr 18, 2011, 10:49:56 AM4/18/11
to ccppb...@googlegroups.com
Obrigado a todos!
Esclareceram bastate.
Estou pesquisando e lendo os links que me passaram.

Vou ver se compro um desses livros, Fernando.

Obrigado!

Em 18 de abril de 2011 11:29, Fernando Roberto <li...@driverentry.com.br> escreveu:
Olá Lucas,

Tudo vai depender um do tipo de interface que o dispositivo que você quer controlar pela porta USB implementa. Afinal, não controlamos a porta em si (como fazemos com portas seriais), mas controlamos os dispositivos através dela.

Primeiro de tudo, se seu dispositivo implementa uma interface padrão, tal como Mass Storage, Teclado, Mouse. O Windows pode manipular tudo pra você, mas isso não elimina a opção de se ter uma implementação específica do seu dispositivo. Por exemplo: Quero que meu mouse use meu driver no lugar do driver padrão.

Se seu dispositivo implementa uma interface customizada, tal como uma máquina de desentortar bananas, o Windows não terá um driver para isso e você terá que implementar por você mesmo. Uma interface customizada pode ser implementada de diversas formas e é o dispositivo quem determina isso. (verificar com o fabricante e datasheet)

Se seu dispositivo implementa interface HID, que usa endpoint "interrupt", você não vai precisar desenvolver nenhum driver. Apenas usando as rotinas da SetupAPI e manipulando o handle do dispositivo via ReadFile/WriteFile você pode fazer tudo o que precisa. Tudo coisa de User-Mode sem as dores do Kernel.

Mas se seu dispositivo usa um tipo de endpoint mais rápido, tal como o "bulk", você pode escolher em desenvolver drivers em User-Mode ou Kernel mode com o WDF, um framework de desenvolvimento de drivers para Windows.

Seu pior caso será se seu dispositivo implementa o endpoint "isochronous", mais usado em stream de audio e vídeo. Nesse caso você será obrigado a escrever um driver em Kernel-Mode e ainda vai esbarrar nas limitações do WDF.

WDF é um framework que facilita o desenvolvimento de drivers WDM. Drivers WDM são mais complicados de serem implementados. Facilidade tem seu preço, nesse caso o WDF possui algumas limitações com relação ao endpoint "Isochronous" e você terá que implementar umas pequenas partes apoiado em conceitos WDM.

Se você é a pessoa que vai desenvolver o firmware que vai rodar na outra extremidade do cabo, então você terá a liberdade de escolher a interface a ser implementada, mas caso contrário, uma boa documentação será suficiente.

Estes são excelentes livros a respeito do assunto:
Um abraço,

--
Fernando Roberto da Silva
DriverEntry Kernel Development
http://www.driverentry.com.br






On 17/04/11 16:19, Lucas Nunes wrote:
Olá!

Gostaria de saber como faço para acessar o hardware do PC (as portas

de I\O) usando C\C++.
Pelo que pesquisei isso depende muito do SO, que no caso estou usando
Windows.
Preciso saber sobre isso, pois vou precisar para um trabalho.

Por exemplo, como leio o que entrada em uma das minhas portas USB?
Usando o stdios dá para ter acesso ao teclado no máximo. Mas eu não

entendo como isso ocorre.
Se segue algum protocolo e etc.

Alguém pode me guiar nesse caminho? Indicam-me algum livro, tutorial
ou outra coisa?

Aproveitando, alguém conhece algum tutorial ou livro bom sobre

Assembly inline (eu sei que é quase a mesma coisa que só o ASM, mas de
preferência o inline), pois acho que isso será útil.


P.S: Eu tenho um bom conhecimento de C\C++ e esse conhecimento de
hardware e baixo nível me serão muito útil (não, não é criar vírus nem
malwares ^^").

Desde já agradeço.



--
Fernando Roberto da Silva
DriverEntry Kernel Development
http://www.driverentry.com.br

Gabriel Novaes

unread,
Apr 18, 2011, 10:28:01 PM4/18/11
to ccppb...@googlegroups.com
Eu não sei se vem ao caso ...
mas por que vc não aprende um pouco de assembly e e usa com c/c++
talvez seja uma boa solução ára vc .........................


  
 

[Gabriel Novaes - "O tolo acha que sabe , o sábio só sabe que nem tudo sabe.]





Date: Mon, 18 Apr 2011 07:40:31 -0300
Subject: Re: [ccppbrasil] Acessar o Hardware com C\C++
From: rodrigo...@gmail.com
To: ccppb...@googlegroups.com

Thiago A. Corrêa

unread,
Apr 19, 2011, 1:50:28 PM4/19/11
to ccppb...@googlegroups.com
Olá,

2011/4/18 Gabriel Novaes <gabriel...@hotmail.com>:


> Eu não sei se vem ao caso ...
> mas por que vc não aprende um pouco de assembly e e usa com c/c++
> talvez seja uma boa solução ára vc .........................
>

Essa solução não é possível com nenhum sistema operacional moderno.
Isso só funcionava com DOS 6 e seus contemporaneos.

Att.
Thiago A. Correa

DriverEntry

unread,
Apr 20, 2011, 10:19:59 AM4/20/11
to ccppbrasil
Isso mesmo Thiago,

Esse é um erro básico e ao mesmo tempo frequente. Algumas pessoas
acham que podem fazer tudo com assembly. Já recebi vários e-mails do
tipo "Fernando, quero desenvolver drivers, mas antes de estudar o
kernel do Windows vou estudar cada detalhe do assembly". Por outro
lado, outros dizem que vão estudar todo o C++ com Boost, STL e sei lá
mais o quê.

A proteção de acesso ao hardware e à memória virtual é implementada em
um trabalho conjunto de hardware e software. Usar assembly não lhe
dará mais poderes quanto a isso.
Então antes de sair estudando física quântica ou nanotecnologia,
verifique se isso vai lhe servir para alguma coisa.

O post do link abaixo comenta esse assunto e faz algumas sujestões de
alguns livros.
http://driverentry.com.br/blog/?p=825

[]s,
Fernando.



On Apr 19, 2:50 pm, Thiago A. Corrêa <thiago.cor...@gmail.com> wrote:
> Olá,
>
> 2011/4/18 Gabriel Novaes <gabrielnova...@hotmail.com>:

Eric Chiesse

unread,
Apr 20, 2011, 12:33:11 PM4/20/11
to ccppbrasil
Fernando, parabéns pelo artigo. Achei excelente.

Dá só uma olhadinha pra pegar algumas letras trocadas ou comidas que
acabaram passando.

Mas parabéns mesmo ! É dificil achar um artigo dessa área em lingua
portuguesa que seja claro, objetivo e completo como o que você
colocou.

Eric.

On 20 abr, 11:19, DriverEntry <li...@driverentry.com.br> wrote:
> Isso mesmo Thiago,
>
> Esse é um erro básico e ao mesmo tempo frequente. Algumas pessoas
> acham que podem fazer tudo com assembly. Já recebi vários e-mails do
> tipo "Fernando, quero desenvolver drivers, mas antes de estudar o
> kernel do Windows vou estudar cada detalhe do assembly". Por outro
> lado, outros dizem que vão estudar todo o C++ com Boost, STL e sei lá
> mais o quê.
>
> A proteção de acesso ao hardware e à memória virtual é implementada em
> um trabalho conjunto de hardware e software. Usar assembly não lhe
> dará mais poderes quanto a isso.
> Então antes de sair estudando física quântica ou nanotecnologia,
> verifique se isso vai lhe servir para alguma coisa.
>
> O post do link abaixo comenta esse assunto e faz algumas sujestões de
> alguns livros.http://driverentry.com.br/blog/?p=825
Reply all
Reply to author
Forward
0 new messages