Periféricos e Interfaces had

Tamanho: px
Começar a partir da página:

Download "Periféricos e Interfaces had"

Transcrição

1 7 Barramentos 7.1 Introdução Neste capítulo será efectuada uma breve descrição de alguns barramentos de um sistema computacional: CAN, ISA/EISA, PCI e USB. Poderiam ser descritos outros barramentos, comuns como por exemplo: AGP, FireWire, etc., ou outros menos comuns actualmente: MCA, Vesa Local Bus, etc.. De qualquer forma este assunto é muito vasto e fica fora do âmbito da disciplina um tratamento exaustivo. Não serão abordados os aspectos físicos da comunicação nos barramentos. Quanto a aspectos lógicos, bem como a programação de transferências de dados sobre estes barramentos, será efectuada uma breve introdução. 7.2 CAN O barramento série assíncrono Controller Area Network (ou Car Area Network), permite a difusão de informação sobre uma rede, onde o suporte físico normalmente consiste num par entrançado semelhante ao usado nas redes ethernet. Foi inicialmente concebido nos anos 80 pela Bosch, para conectar Electronic Control Units, ie. unidades de controlo de sistemas embebidos de um veículo automóvel, como por exemplo: unidade de controlo do motor; da transmissão; das portas; da climatização; etc.. Hoje em dia o seu uso vulgarizou-se, sendo aplicado também em sistemas de controlo industriais embebidos. Este barramento foi concebido para transportar dados em ambiente ruidosos, do ponto de vista electromagnético, sendo efectuado um cuidadoso controlo de erros nos pacotes que nele circulam. A velocidade de transferência de dados varia entre 1 Mbit/s e 10 Kbit/s. Quanto maior for a velocidade de transferência de dados menor deve ser o comprimento do cabo de ligação ponto a ponto. Para 1 Mbit/s não deve ser superior a 40 metros, já para 125 Kbit/s poderá atingir 500 metros. 7.3 ISA / EISA O barramento Industrial Standard Architecture, é o mais antigo e o mais lento ainda presente nos PCs, no entanto é também o mais simples e o mais barato. O desenvolvimento de cartas para este barramento pode ser efectuado sem grandes recursos, e sem necessidade de um laboratório especificamente equipado, o que não é o caso de outros barramentos mais recentes e mais complexos como por exemplo o PCI. Este barramento foi desenvolvido nos finais da primeira metade da década de 80, e constituí uma adaptação do barramento original dos PCs, praticamente uma extensão do barramento do processador 8088, com 8 bits para dados e 20 bits para endereços, para suportar os processadores 80286, com um barramento de dados de 16 bits e 24 bits para endereços. Foi aumentado também o número de linhas de interrupção e canais de DMA, mas manteve-se as características de um barramento centralizado num só processador. Tal como os barramentos MCA e EISA, este barramento é denominado de expansão, podendo ser inseridas cartas de expansão nos slots. Nos PCs mais antigos, o barramento de expansão permitia aceder também à memória, apenas através de buffers e lógica adicional. Actualmente a memória é acedida pela CPU através do barramento de sistema (também chamado local bus nos sistemas mais antigos), que está isolado do barramento de expansão por uma ponte: Expansion Bus Bridge. PIN T07-1/12

2 Fig. 7-1: Barramento ISA/ EISA (in Messmer, 2002) Um dispositivo ISA pode ser equipado com portos de E/S, memória mapeada e linhas de interrupção. Embora os processadores x86 usem 16 linhas para endereçamento dos portos de E/S, ie 64KBytes de memória de E/S assignada a portos, os PCs mais antigos usam apenas 10 linhas, ie portos E/S de 8 bits. Como já foi referido, a função ioperm() permite acesso apenas aos portos 0H-3FFH. Para acesso aos restantes é necessário aumentar o nível de privilégio no acesso ao hardware com a função iopl(). O endereçamento de memória disponível para um dispositivo ISA é apenas entre os 640 KB e o 1 MB e entre 15 MB e os 16 MB. Este barramento não suporta endereçamento geográfico, isto é não é possível endereçar um slot, especifico no barramento. Do mesmo modo as linhas de interrupção são partilas por todo o barramento, de modo que para evitar que mais que um periférico use a mesma linha de interrupção memória ou portos de E/S, ie. os mesmos recurso, as cartas tem de ser configuradas com jumpers ou dip switches ISA Plug & Play Para evitar a configuração manual das cartas, foi desenvolvida a especificação ISA Plug & Play. Dispositivos que suportem esta especificação incluem áreas de E/S (memória e portos) relocatáveis, tal como os dispositivos PCI. Para isto são utilizados um conjunto de registos de de configuração independentes do dispositivo, e um meio de endereçar geograficamente os slots, embora o barramento físico ISA não o suporte: cada carta contém um identificador único de 64 bits, de modo que embora os sinais no barramento ISA sejam direccionados para todos os slots, existe um meio de identificar a carta. Esta especificação é muito mais complexa que a PCI, mesmo porque o barramento ISA não tem suporte nativo, ao contrário do PCI, sendo preferível, se possível, usar dispositivos PCI. PIN T07-2/12

3 7.3.2 EISA Um extensão de 32 bits foi desenvolvida para o barramento ISA: Extended ISA. O conector de cada slot permite também instalação de cartas ISA. Este barramento é deseno para permitir a configuração dos periféricos por software, sem jumpers ou dip switches, tal como nos barramentos PCI e MCA 7.4 PCI A especificação Peripheral Component Interconnect define não apenas um conjunto de condutores para comunicação, mas um conjunto completo de regras definindo como diferentes partes de um computador devem interactuar. A arquitectura PCI foi desenvolvida para substituir a ISA, com 3 objectivos: - Melhor desempenho na transferência de dados - Simplificar a adição e remoção de periféricos ao sistema - Ser o mais possível independente da plataforma. A melhoria de desempenho é conseguida não apenas com um barramento de dados e endereços de 32 bits ou 64 bits, mas também com uma velocidade de relógio superior: entre 25 MHz e 133MHz ao passo que na arquitectura ISA é de apenas 8,33 MHz. Assim um barramento de 32 bits, a 66 MHz atinge uma taxa de transferência de dados de 266 MBytes/s O espaço de E/S num barramento PCI usa 32 bits para acesso a portos e 32 ou 64 bits para acesso à memória. Para simplificar a adição de periféricos ao sistema, a especificação suporta Plug & Play, sendo possível o endereçamento geográfico das cartas e estas contém espaço de E/S relocátavel. A especificação suporta nativamente interrupções partilas, que tal como as áreas de E/S podem ser automaticamente atribuídas na inicialização do sistema por uma BIOS PCI. Fig. 7-2: Barramento de sistema, PCI e ISA/EISA (in Messmer, 2002) PIN T07-3/12

4 A ligação do barramento de sistema ao PCI é efectuado pela ponte PCI, normalmente localizada no chipset. A ponte para comunicação com o barramento de expansão também está incluída no chipset. Normalmente a interface entre outros barramentos, como o SCSI e o USB, e o barramento de sistema, é efectuada através de uma unidade PCI localizada num um porto PCI. Fig. 7-3: Sistema PCI típico (in Corbet et al., 2005) A especificação original permite que um único sistema suporte 256 barramentos PCI, cada um deles com 32 dispositivos, no entanto para grandes sistemas é usado o conceito de domínio. Cada domínio suporta 256 barramentos PCI. Assim cada periférico PCI é identificado por um inteiro de 32 bits: - número de domínio (16 bits) - número de barramento (8 bits) - número de dispositivo (5 bits) - número de função (3 bits) Na linha de comando Linux podem-se identificar os dispositivos PCI com: lspci 0000:00:00.0 Host bridge: Intel Corp. 440BX/ZX/DX BX/ZX/DX Host bridge (rev 01) 0000:00:01.0 PCI bridge: Intel Corp. 440BX/ZX/DX BX/ZX/DX AGP bridge (rev 01) 0000:00:07.0 ISA bridge: Intel Corp AB/EB/MB PIIX4 ISA (rev 08) 0000:00:07.1 IDE interface: Intel Corp AB/EB/MB PIIX4 IDE (rev 01) 0000:00:07.2 USB Controller: Intel Corp AB/EB/MB PIIX4 USB 0000:00:07.3 Bridge: Intel Corp AB/EB/MB PIIX4 ACPI (rev 08) 0000:00:0f.0 VGA compatible controller: VMWare Inc [VMWare SVGA II] PCI Display Adapter 0000:00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01) 0000:00:11.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10) 0000:00:12.0 Multimedia audio controller: Ensoniq ES1371 [AudioPCI-97] (rev 02) Repare-se no endereçamento:dominio:barramento:dispositivo:função A ponte PCI/Host efectua o interface entre o barramento de sistema, ou host bus, PCI. Para isso contém um unidade para acesso a cada barramento e dois registos de configuração que PIN T07-4/12

5 permitem aceder aos registos de configuração de cada unidade PCI, que indicam as áreas de entrada e saída relocatáveis. Fig. 7-4: Estrutura da ponte PCI (in Messmer, 2002) O acesso à área de configuração é efectuado através dos dois registos de 32 bits referidos acima, através dos portos: 0CF8H 0CFCH config_address config_data Assim o registo ou endereço de configuração de uma dada unidade a aceder é indicado através do registo config_address e acedido através do registo config_data. Fig. 7-5: Estrutura do registo config_address para ciclo de configuração tipo 1 (in Messmer, 2002) No registo config_address é colocado o endereço PCI que é enviado no ciclo de configuração. Na figura acima apresenta-se os campos para um ciclo tipo 1, onde Type deverá ter o valor 1. O ciclo tipo 0 indica o slot do dispositivo nos bits 30 a 11, ie. os campos reserved, Bus e Unit são substituídos pelo campo Device Select. O espaço de configuração PCI é de pelo menos 256 bytes para cada função de uma dada unidade (para cada periférico). No caso da especificação PCI express este espaço é de 4 KBytes. Para se aceder à área de configuração, o bit ECD tem de ter um valor não nulo, deve ser especificado em BUS o número do barramento, a unidade ou dispositivo em UNIT, a função em Function. Register endereça um dos 64 campos de 32 bits na área de configuração especificada. PIN T07-5/12

6 Os primeiros 64 bytes da área de configuração, constituem um cabeçalho padronizado. Os restantes 192 bytes são dependentes do sistema. O cabeçalho que contém a seguinte informação: Fig. 7-6: Endereços de configuração PCI padrões (in Corbet et al., 2005) A especificação PCI apenas requer que sejam obrigatoriamente os registos Device/Unit ID, Vendor/Manufacturer ID, Command/ Instruction e Status. O valor do registo Vendor ID identifica o fabricante. Um registo global é mantido pelo PCI Special Interest Group atribuído por um comité que define o padrão PCI. Por exemplo a identificação da INTEL é 8086H. Valores válidos do registo Device ID estão na gama [0000H, FFFEH]. O valor FFFFH indica que a unidade PCI não está instalada, de modo que, por exemplo, uma rotina de inicialização da BIOS PCI possa identificar todas as unidades PCI existentes no arranque do sistema. Este valor é atribuído pelo fabricante e não necessita. Ao conjunto do Vendor ID:Device ID, um inteiro de 32 bits que identifica unicamente o dispositivo é chamado assinatura. O registo Class Code indica o tipo de unidade PCI. O campo está subdividido em três secções de um byte. O byte mais alto (no offset 0BH) indica o código base da classe (ou o grupo), o byte seguinte o código da sub-classe e o último byte indica a interface de programação. Por exemplo ethernet e token ring são duas sub-classes do grupo network, e as sub-classes serial e parallel pertencem ao grupo communications. Os dois bits mais baixos do registo Header definem o tipo de cabeçalho padrão, que pode ser: 0H Normal 01H - Bridge 82H Cardbus 128 Bus (ISA, USB, Firewire,...) Mais informações podem ser consultadas em: </usr/src/linux/include/linux/pci.h>. O registo Command define como a unidade deve reagir aos ciclos PCI. O registo Status indica o estado da unidade durante uma operação. PIN T07-6/12

7 O registo IRQ Line indica a linha IRQ de interrupção de hardware atribuída à unidade PCI, com valores válido num PC entre 0 e 15. Uma descrição mais pormenorizada destes campos pode ser encontrada em (in Corbet et al., 2005). O exemplo seguinte mostra como usar os registos config_address e config_data para ler informação de uma unidade PCI: #define config_address 0x0CF8 #define config_data 0x0CFC #define VENDOR 0x00 //Vendor/Device ID #define REVISION 0x02 //Revision (byte 8) #define ECD 0x #define BUS 0 #define UNIT 0 #define FUNCTION 0 #define TYPE 1 #define PCIADR(Bus,Unit,Fnc,Reg) ECD + ((Bus & 0xFF)<<16) + \ ((Unit & 0x1F)<<11) + ((Fnc & 0x07)<<8) + \ ((Reg & 0x3F)<<2) + (TYPE & 0x03) main() { int data, adr; //Vendor / Device ID adr=pciadr(bus,unit,function,vendor); outl(adr, config_address); inl(config_data); printf("device/vendor ID: %08XH\n", data); printf("vendor ID: %04XH\n", data & 0xFFFF); printf("device ID: %04XH\n", (data >> 16)& 0xFFFF); } //Revision adr=pciadr(bus,unit,function,revision); outl(adr, config_address); inl(config_data); printf("revision: %02XH\n", data & 0xFF); A revisão pode ser confirmada com o comando lspci já acima descrito. Todos os registo de configuração PCI têm os bytes organizados segundo o padrão littleendian, de modo que é necessário inverter a ordem dos bytes e/ou words, para que correspondam à Fig No caso de Vendor ID e Device ID e Class a informação é apresentada sem inverter os bytes, como se pode confirmar, por exemplo para a função 0 da unidade 0 do bus 0 do domínio 0, com: /sys/bus/pci/devices/0000:00:00.0/vendor 0x8086 /sys/bus/pci/devices/0000:00:00.0/device 0x7190 /sys/bus/pci/devices/0000:00:00.0/class 0x Outra forma de ver a tabela com os registos de configuração, que não necessita de reordenação dos bytes e words, poderá ser: PIN T07-7/12

8 Fig. 7-7: Endereços de configuração PCI padrões como retornados pela macro inl Os endereços base de memória de entrada saída, são indicados em 6 ponteiros de 32 bits. Os 4 bits baixos destes ponteiros, que devem ser assumidos como 0, em termos de endereço de memória, descrevem o tipo de recurso de entrada-saída: Fig. 7-8: Endereços de base das áreas de entrada saída PIN T07-8/12

9 O bit 0 indica se o endereço se refere a memória de entrada saída, se for nulo, ou a portos de entrada saída, se não for nulo. No caso de memória de entrada-saída os bits 1 e 2 definem o tipo: 00 Endereçamento de 32 bits 01 Endereço de memória abaixo do primeiro MByte (obsoleto). 10 Endereçamento de 64 bits Se o bit 3 estiver assinalado, indica que o espaço de endereçamento é prefetchable, e que a CPU pode colocar valores na memória cache para optimizar o acesso. É o caso da memória de video nas cartas PCI. No entanto, se uma área de memória mapear também registos de controlo do dispositivo, a área deve ser marcada como não prefetchable, colocando este bit com um valor nulo, de modo que a evitar que o CPU leia continuamente valores do cache e não os valores actuais dos registos. Para determinar a quantidade de memória alocada a cada área escreve-se em todos os bits do registo de endereço base 1s, ie. FFFFFFFFH, e depois lê-se esse mesmo registo. Os recursos podem ser visualizados com ou com: /sys/bus/pci/devices/0000:00:0/resource lpsci -vx Registo de um Driver PCI O registo de um driver PCI é um pouco diferente dos restantes drivers. Deve ser usada a função: pci_register_driver (struct pci_driver *arg); que retorna 0 em caso de sucesso e o argumento deve ser uma estrutura pci_driver. Um dos campos desta estrutura, name, é uma string com o nome do driver, como indicado em: ls /sys/bus/pci/drivers O registo pode ser eliminado com: pci_unregister_driver(struct pci_driver *arg); 7.5 USB O barramento Universal Serial Bus classifica-se como externo, sendo destinado a ligação simplificada de periféricos externos. A ligação pode ser efectuada a quente, isto é sem desligar o computador. Algumas classes de periféricos, tais como: teclados, ratos, joysticks, adaptadores de rede, modems e dispositivos de armazenamento, se respeitarem a especificação USB não necessitam de driver. PIN T07-9/12

10 A velocidade de transferência de dados pode atingir 480 Mbits/s na versão 2.0. O suporte físico consiste em duas linhas diferenciais para transferência de dados (+D e D) e onde a diferença de potencial entre elas é no máximo 4 Volts, e duas linhas de alimentação (GND e VBus). Deste modo é possível que um periférico USB seja alimentado pelo próprio barramento USB, não sendo necessário fontes de alimentação adicionais. Fig. 7-9: Descrição física do barramento USB (in Messmer, 2002) O Controlador USB localizado no host, ie. na motherboard ou numa placa de expansão PCI, é responsável por periodicamente interrogar os periféricos se tem dados para transferir, ie. num esquema de pooling, onde os periféricos nunca podem enviar dados sem primeiro serem pedidos pelo controlador USB host. No entanto alguns periféricos, como dispositivos de áudio e vídeo, podem requisitar uma largura de banda fixa, de modo a transferir dados com uma taxa constante. Como os dispositivos poderão ter de aguardar algum tempo até que o controlador USB lhes requisite uma transferência de dados, têm um buffer (FIFO) para armazenar dados até que os possam transmitir. O controlador USB host actua como um distribuidor ou hub, onde podem ser ligados vários dispositivos USB, os nós, ou outros hubs. No entanto este controlador não é apenas um simples distribuidor, pois terá de regular o tráfico de acordo com a largura de banda requisitada pelos dispositivos. Fig. 7-10: Topologia do barramento USB (in Messmer, 2002) A comunicação ao nível mais básico é efectuada através de um endpoint. Um endpoint transfere dados apenas num sentido, e pode ser visto como um pipe unidireccional. Os endpoints são agrupados em interfaces. Este interfaces suportam apenas uma classe de dispositivos, tal como um ratos ou teclados. PIN T07-10/12

11 As interfaces são agrupadas em configurações. Um dispositivo USB pode ter várias configurações e comutar entre elas para mudar o estado. Por exemplo um dispositivo que permita actualização do firmware, poderá ter uma configuração especifica para essa tarefa. Fig. 7-11: Estrutura de um dispositivo USB (in Corbet et al., 2005) Tal como os dispositivos PCI, os dispositivos USB podem ser identificados por um Vendor ID (2 bytes), um device ID (2 bytes), um número de versão (2 bytes) e um código de classe (3 bytes). Durante a inicialização do sistema operativo, o host determina que tipos de dados cada unidade USB suporta e qual a largura de banda que requer e atribuí um endereço numa gama de 0 a 127. Em Linux, podem ser identificados os dispositivos ligados ao host, através do sistema de ficheiros virtual sysfs: /sys/devices/pci0000:00/0000:00:07.2/usb1/1-0:1.0/ No exemplo acima, é assumido que o controlador USB host, está no barramento PCI 0, do domínio 0 e tem o número de dispositivo 7 e função 2: lspci :00:07.2 USB Controller: Intel Corp AB/EB/MB PIIX4 USB... A referência USB do dispositivo é dada por: no formato: 1-0:1.0 root_hub number-hub-port:config.interface A comunicação de dados é efectuada através de blocos de dados, ou pacotes, tal como na interface SCSI. Neste caso são chamados URBs: USB Request Block. PIN T07-11/12

12 7.5.1 Registo de um Driver USB O registo de um driver USB também é diferente dos restantes drivers. Deve ser usada a função: usb_register (struct usb_driver *arg); que retorna 0 em caso de sucesso e o argumento deve ser uma estrutura usb_driver. Um dos campos desta estrutura, name, é uma string com o nome do driver, como indicado em: ls /sys/bus/usb/drivers O registo pode ser eliminado com: usb_deregister (struct usb_driver *arg); 7.6 Bibliografia Corbet, Jonathan, Alessandro Rubini e Kroah-Hartman, Greg (2005). Linux Device Drivers 3rd edition, O Reilly, [último acesso em: 1 mar 2007] Messmer, Hans-Peter (2002). The Indispensable PC Hardware Book 4 th edition, Addison- Wesley Salzman, Peter Jay, Michael Burian and Ori Pomerantz (2005). The Linux Kernel Module Programming Guide, [último acesso em: 1 mar 2007] Linux man pages PIN T07-12/12