você está aqui: Home  → Arquivo de Mensagens

Desligando computadores Linux sem monitor e teclado,

Colaboração: Herbert G. Fischer

Data de Publicação: 11 de Dezembro de 2001

Experiência com a porta paralela, I/O e Linux!

Isso nunca foi feito antes, bom, pelo menos eu procurei na Internet e não achei nada. ;-)

Essa experiência exige um mínimo conhecimento de hardware e eletrônica. Eu não sei quase nada sobre eletrônica, e consegui inventar um jeito de desligar meu gateway de acesso à internet via cable-modem (um PC com Slackware 8.0 bem fuçado) sem ter que utilizar qualquer um dos 3 computadores que desfrutam do acesso à internet aqui em casa.

Essa idéia surgiu do problema que sempre que ninguém mais está usando o acesso, eu tinha que ligar meu micro, dar um ssh e dar o comando halt para desligar o gateway (graças ao racionamento de energia elétrica). E como tenho até MySQL nele, não poderia simplesmente tirar a checagem do disco (e2fsck, "scandisk" para os leigos) e desligar ele sem dar um 'halt' antes. Recentemente eu estava utilizando algumas portas no inetd pra chamar o halt, mas o pessoal aqui em casa achava difícil dar um (telnet gw porta) e esperar um pouquinho pra apertar o botão de power do gateway. Além de também facilitar para os hackers brincarem de desligar o micro remotamente.

Com esse esquema é só apertar um push-button no painel do gateway, esperar uma sirene e desligar fisicamente o gateway. Eu chamei minha invenção de "Halt Button". Se seu micro for um daqueles que ao desligar o sistema operacional (Linux ou Windows) ele desliga tudo, inclusive a máquina, vai ficar melhor ainda (ATX). Você não vai nem precisar apertar o botão de power off.

Pra fazer tudo isto, é necessário ter em mãos alguns aparatos. No momento eu tinha todos em casa, e não gastei um tostão pra fazer isso. Eu utilizei o que tinha, mas existem dezenas de outras formas pra fazer algo semelhante a isso e com o mesmo propósito. Aqui está a lista:

Hardware

1) Conector Macho DB25 (25 pinos) vulgarmente conhecido como conector parelelo. Em outras palavras, um conector que encaixa na saída de sua impressora.

2) Um botão (interruptor) de pressão (sempre fechado / aberto). Eu não sei o nome correto, mas tem que ser um botão do tipo que você pressiona uma vez e pronto, não tem que "ficar" pressionado. O meu eu já tinha no meio das tranqueiras guardadas. Ele tem até umas porquinhas pra fixar no painel.

3) 50cm de fio fino duplo (ou o suficiente pra sair de trás do micro, passar por dentro dele e chegar até o painel de plástico do gabinete). Não use um fio muito grosso senão seu aparato vai ficar ridículo e talvez nem funcione. O meu fio eu peguei de um fone de ouvidos quebrado.

4) Uma capa de conector DB25. É só pra facilitar na hora de conectar/desconectar na porta paralela.

Ferramentas

1) Chave de fenda e/ou philips para abrir o gabinete.

2) Ferro de solda. Se você não tiver um, não compensa comprar só pra fazer isso. Peça para alguém soldar pra você.

3) Solda (estanho) para soldar é claro... ;)

4) Furadeira e broca para fazer um buraco na frente do micro onde você vai prender o interruptor. Dá pra fazer com o ferro de solda, mas fede muito!

Ahhh.... lembrei... antes de tudo, sua porta paralela deve estar livre... ou seja, nada mais pode estar ligado a ela. Se estiver, sinto muito, mas não chore porque há outra solução possível. Se este micro tiver uma porta de joystick, pule de alegria. Dá pra fazer a mesma coisa com essa porta, só não me pergunte como. Pesquise você mesmo ;)

Bom... agora... mãos na massa....

Lembre-se... eu não me responsabilizo por danos ao seu equipamento... Só estou dando a idéia, que funcionou comigo sem queimar nada... ;)

1- Solde a ponta de um dos dois fios no pino 2 do conector (está escrito no conector a numeração dos pinos). Este pino é chamado de D0 ou DATA0. É um pino de saída.

2- Solde a ponta do outro fio no pino 13 do conector. Este pino é chamado de SELECT. É um pino de entrada.

3- Solde as duas pontas do outro lado do fio em cada terminal do interruptor. Fechando o circuito.

4- Agora, grave copie o código fonte abaixo e cole num arquivo chamado ppsw.c

  =============== copie após esta linha  ==== ppsw.c
  #include <stdio.h>
  #include <stdlib.h>
  #include <sys/io.h>
  #include <unistd.h>
  
  typedef char byte;
  
  /*
   Port addresses ('dmesg | grep parport0')
   0x3bc = lp0       0x378 = lp1       0x278 = lp2
  **/
  #define BASEPORT 0x378
  #define DATA BASEPORT+0
  #define STATUS BASEPORT+1
  #define CONTROL BASEPORT+2
  
  /*
   Function headers
  **/
  byte isbitset (byte val, byte bit);
  byte setbit (byte val, byte bit);
  
  /*
   And... here it is... The main part...
  **/
  int main (int argc, char *argv[])
  {
   byte signal=setbit(0, 0);
   byte data=0, status=0, control=0;
  
   if (argc == 1)
   {
    printf("PPSW - Parallel Port Switcher\n");
    printf("by Herbert G. Fischer 2001\n");
    printf("GPL license (http://www.gnu.org/licenses/gpl.html)\n\n");
    printf("ppsw [cmd] &\n");
    printf("[cmd] - full path to application to run\n\n");
    exit(1);
   }
  
   // get permissions to use I/O ports
   if (ioperm(BASEPORT, 3, 1))
   {
    perror("ioperm");
    exit(1);
   }
  
   while (1)
   {
    // send a bit to port
    outb(data, DATA);
    // get response from input
    status = inb(STATUS);
    if (isbitset(status, 4))
    {
     // run the specified program
     if (!system(argv[1]))
      exit(1);
     else
      exit(0);
    }
    // wait 50ms to loop again
    usleep(50000);
   }
  
   // free I/O permissions
   if (ioperm(BASEPORT, 3, 0))
   {
    perror("ioperm");
    exit(1);
   }
  
   return 0;
  }
  
  // is the 'bit' set on 'val'?
  byte isbitset (byte val, byte bit)
  {
   byte bitpos[] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 };
   return (val & bitpos[bit]);
  }
  ============================ copie só até a linha anterior
  
  5- No shell do Linux, de o comando 'dmesg | grep parport'. Irão aparecer
  algumas linhas, mostrando a porta de I/O (E/S) que está configurada a
  sua porta paralela.  No meu micro apareceu assim: 'parport0: PC-style
  at 0x378 [PCSPP,TRISTATE]'.  0x378 é a porta.
  
  6- Abra o arquivo ppsw.c em seu editor favorido (vim, elvis, nedit,
  etc), e mude a linha '#define BASEPORT 0x378', para o endereço em que
  está sua porta paralela. Não esqueça de respeitar a licença GPL hein!?
  
  7- Agora é só compilar o programa com o comando 'gcc -O2 ppsw.c -o ppsw'
  e copiar o executável para um diretório de executáveis. Eu coloquei ele
  no "/sbin" por se tratar de um executável relacionado à inicialização
  e desligamento do linux.
  
  8- Para testar se está funcionando, execute o comando 'ppsw /sbin/lsmod'
  e aperte o interruptor. Se aparecer uma lista de módulos de kernel na
  sua tela, meus parabéns, senão, boa sorte como detetive. ;)
  
  9- Coloque a linha '/sbin/ppsw /sbin/halt &' no seu rc.local
  (/etc/rc.d/rc.local no Slackware) para que o programa do interruptor
  esteja sempre rodando.
  
  10- Se você quizer um feedback sonoro para saber quando poderá apertar
  o botão power do micro, segue abaixo um programinha para emitir sons
  pelo auto-falante do micro que eu fiz. Copie e grave como siren.c. Pra
  compilar: gcc -O2 siren.c -o siren.  Este deve estar em /sbin.
  
  ------------- copie depois desta linha - siren.c
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
  #include <fcntl.h>
  #include <linux/kd.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <sys/ioctl.h>
  
  int main (int argc, char* argv[])
  {
   int console;
   int i;
  
   if ( (console = open("/dev/console", O_NOCTTY)) >= 0 )
   {
    for (i=0; i<10; i++)
    {
     ioctl(console, KDMKTONE, (250<<16)+400);
     usleep(250000);
     ioctl(console, KDMKTONE, (250<<16)+300);
     usleep(250000);
    }
    close(console);
   }
   else
   {
    printf("Error opening /dev/console\n");
    return 1;
   }
   return 0;
  }

11- Se estiver usando Slackware, abra o arquivo /etc/rc.d/rc.0 e insira a linha '/sbin/siren &' antes da linha 'poweroff' que normalmente é a penúltima linha do arquivo. Assim, quando você der um halt, seja pelo shell ou pelo botão, seu micro irá tocar uma sirene quando estiver pronto para ser desligado. Mas espere a sirene terminar de tocar. ;)

Note que esse interruptor, não serve apenas para desligar o micro. Dá pra fazer um monte de coisas com essa idéia. Inclusive, dá até pra colocar mais de 1 interruptor com a mesma porta. É só usar pinos diferentes. A porta paralela tem 8 pinos DATA de saída e um pouco menos de entrada. Acho que dá pra ligar uns 4 interruptores diferentes.

Se quiser aprender mais, veja os sites abaixo:

http://www.hardwarebook.net/connector/parallel/parallelpc.html http://www.doc.ic.ac.uk/~ih/doc/par/=

  Herbert G. Fischer
  Consultor GNU/Linux e Escritor
  www.geek.pro.br


Veja a relação completa dos artigos de Herbert G. Fischer

 

 

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script