# Introdução aos Sistemas Operacionais/Exemplo de Comunicação com Hardware em Drivers Linux: Título 1

Licença (GLP) Adalberto R. Sampaio Junior, Everton Lima Aleixo, Pedro Henrique Pires.
Esses exemplos foram feitos com base no capitulo 9 (Comunicação com o hardware)do livro ldd (Livro do cavalo), versão 3 , e os sites:
* http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
* http://www.easysw.com/~mike/serial/serial.html#2_5_3
* http://tldp.org/HOWTO/IO-Port-Programming-6.html#ss6.3
* http://ubuntuforums.org/showthread.php?p=2511814
* http://tomoyo.sourceforge.jp/cgi-bin/lxr/ident?i=fg_console
Esses exemplos teve como objetivo dar um embasamento prático para realização do segundo trabalho da disciplina de de Sistemas Operacionais, da Universidade Federal de Goias, no segundo semestre do ano de 2010, ministrada pelo professor Marcelo Akira.
Conseguintos com este trabalho ter um maior entendimento a respeito das estrututas minimas necessárias usadas pelo Kernel para fazer a comunicação com o hardware assim como as estruturas minimas necessaŕias que um dispositivo deve ter para tal comunicação. Tivemos também um aprendizado teórico sobre como essa comunicação é feita.
Para conseguir esses feitos, reproduzimos diversos exemplos.

## Communicating with hardware
### Starting

Este foi o nosso primeiro passo, nesse estudo. Esse código não faz nada alem de imprimir o valor do i, referente a um for. A importancia para o nosso estudo é a função wmb, que é uma barreira para melhorar o fluxo das mensagens, não deixando que o que estiver abaixo dela, seja enviando antes do que seja enviado o que estiver acima dela. Esse tipo de coisa pode ocorrer sem essa função por motivos de otimização do kernel.

### IO memory

Esse código mostra como se faz locações de porta, sendo essas portas registradores mapeados na memória. Para isso é necessário fazer um mapeamento pois não temos acesso direto ao endereço de onde será simulado o registrador.

### Locate Port

Esse código mostra como se faz locações de porta, sendo essas portas registradores fisicos.

### Manipuling Port

Esse código ensina a como manipular as portas (Registradores) em baixo nivel, nesse exemplo, se escreve/le strings e words, ("words" significa o tamanho de bits que serão enviados, os outros tamanhos são, byte - 8 - e longword - 32 - a word são 16) para usar esses outros tamanhos basta trocar o sulfixo (insb, insw, insl, outb, outw, outl).

### Port as Memory

Esse código, é um exemplo de como alocação de porta (Registradores) de tal forma, que fica abstraido para o programador, se o computador irá usar registradores físicos ou registradores simulados em memória, que é algo muito usado. Essa abordagem facilita bastante a vida do programador pois ele não precisa se atentar a quais as portas o computador possui.

## Creating a Device

Esse código simula um dispositivo de hardware. Para testar, deve-se criar um arquivo que servirá de fachada para o Kernel e o device. Para criar esse arquivo deve-se usar o comando "mknod", deve-se usar da seguinte forma: Primeiro levando o modulo device, e verifica qual o Major number desse novo device, você pode verificar esse número com o comando "dmesg"; Agora vá a pasta "/dev" e execute o comando "mknod chardev -c Major_Number 0"; Pronto, essa será a fachada do novo device. Tudo que o device escrever será enviado para esse arquivo e tudo que o voce quiser enviar para esse dispositivo deve ser enviado para esse arquivo também. Isso faz com que o Kernel possa ler/escrever sempre no mesmo local para qualquer dispositivo desse mesmo tipo, mesmo que seja de fabricantes diferentes, sendo necessário apenas que o driver desse dispositivo redirecione para esse arquivo.

## Leddings

Neste exemplo, quando se executa o comando "insmod leds.ko", é feita a inserção desse módulo no kernel. Nele é feita uma comunicação real com o hardware. Executando em uma máquina real, os leds do teclado ficam piscando enquanto o módulo estiver no Kernel, já se executado em uma máquina virtual, ao invés de piscar os leds, dado que uma máquina virtual não tem leds propriamente dito, ele fica variando a CAIXA das letras, momento CAIXA ALTA momento CAIXA BAIXA, pois a máquina virtual é programada para simular esse hardware, e nessa simulação, é programado para quando receber um sinal de acende o led, ele inverte a CAIXA.
Tivemos alguns problemas para reproduzir esse código: 1 - Por default não existe a biblioteta linux/config.h SOLUÇÃO:
2 - Na nossa fonte de códido nos headers havia o header linux/vt.h, que existe então não acusa erros, mas ele serve para nos fornecer a variavel fg_console, mas esse header não possui mas essa variavel. SOLUÇÃO