Os macros de acesso das portas I/O (entrada e saída), estão descritos no arquivo io.h , geralmente em /usr/include/asm. Neste biblioteca encontra-se as rotinas necessárias para a acesso as portas de seu PC.
A chamada ioperm(), declarada em unistd.h, quando executada por um programa, necessita de privilégios de root. Para execução deste exemplo, você precisa ter estes privilégios na execução do programa gerado, por isso cuidado com o que você vai criar.
A sintaxe do ioperm() é:
ioperm(porta, número, permissão)
Onde:
porta : é a porta
número: é o número consecutivo de acesso a porta, por exemplo:
ioperm(0×170,2,1)
Você terá acesso a porta 0×170 até 0×172, ou seja, terá acesso a 3 portas.
permissão: é especificado para se dar permissões do programa a portas (true(1), false(0)).
Uma outra forma de se acessar as portas é por meio da chamada open(), informando o endereço da porta (/dev/porta).
/proc/ioports
No arquivo /proc/ioports, estão descritas os endereços das portas em seu computador, nesse caso para saber o endereço de sua porta paralela:
cat /proc/ioports | grep parport
Isso irá exibir algo como:
0378-037a : parport0
Com esse dado, sua porta paralela esta em: 0×378.
Obtendo status de sua porta:
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>
#include <stdlib.h>
#define PORTA 0×378 /* usando a porta pararela */
int main ()
{
/* obtendo acesso a porta */
if (ioperm(PORTA, 3, 1))
{
perror(“Erro na chamada ioperm()”);
exit(1);
}
/* obtendo status da porta */
printf (“Status da Porta é %d \n”, inb(PORTA+1));
return(0);
}
Devido algumas restriçoes do gcc na compilação é necessário passar parametros de otimização (-O2), por exemplo:
gcc -O2 -o porta porta.c
As vezes eu me arrependo de nunca ter feito eletrônica, mas René Descartes fala em um de seus livros, para ser um bom filosofo nunca faça filosofia. Se levar para o lado da informatica, então estou no caminho certo.