Dados gerais

Interface: DMAController_i386
Arquivos: dmacontroller_i386.h
Última atualização: 08/06/2005
Autor: Luiz Henrique Shigunov
Informações

Descrição
Funções para o sistema

0x00 - Alloc - Aloca um canal de DMA
0x01 - Free - Libera um canal de DMA

0x03 - Setup - Configura um canal de DMA

Descrição

Esta página descreve a interface DMAController_i386 que trata do acesso ao controlador de DMA para a arquitetura IA32 da Intel.

O DMA é o componente que controla como as transferências de dados dos periféricos (disco rígido, disquete, ..) para a memória e da memória para os periféricos ocorrerão. Os computadores compatíveis com o PC/AT têm dois DMAs em endereços diferentes.

Cada DMA possui 4 canais (0-3). No PC/AT os canais 0-3 do DMA mestre são chamados de canais 4-7. Com isso, são disponibilizados 7 canais, pois o canal 4 do PC/AT (canal 0 do DMA mestre) é usado para conectar os DMAs.

No PC/AT os canais são assim atribuídos:

CanalUsado por
0livre/refresh da memória
1livre
2controlador de disquete
3livre
4usado para ligar o escravo no mestre
5livre
6livre
7livre

Em algumas placas mães, o canal 0 é livre, mas por motivos de compatibilidade ele não é usado.

Os canais de 0 até 3 são canais de 8 bits, ou seja, transferem bytes. Já os canais de 4 até 7 são canais de 16 bits, ou seja, transferem words. Como os registros de contagem do DMA são de 16 bits, apenas 64K no máximo pode ser transferido. Nos canais de 0 até 3 isso equivale a 64KB nos de 4 até 7 128KB.

Cada canal de 0 até 3 vai ter uma região de memória física abaixo de 16MB com 64KB de tamanho para colocar os dados lidos ou que vão ser escritos. Já os canais de 5 até 7 vão ter uma região de 128KB.

Funções para o sistema

Estas funções são de uso exclusivo dos módulos do sistema.

0x00 - Alloc

Sintaxe

void *DMAController_i386_Alloc(Module *modID, unsigned int channel, unsigned int bufferSize);

Propriedades

Descrição

Esta função registra o canal channel para o módulo modID. Antes de utilizar o DMA o canal deve ser registrado para evitar conflitos.

bufferSize é o tamanho do buffer em páginas de memória.

O tamanho do buffer pode ter 16 páginas no máximo para os canais 0-3 e 32 para os canais 5-7.

Antes de mandar escrever num dispositivo esse buffer deve ser preenchido com os dados e, depois da leitura do dispositivo, os dados devem ser lidos desse buffer.

Após registrado o canal tem que ser configurado para poder ser utilizado.

Valor de retorno

Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.

0x01 - Free

Sintaxe

int DMAController_i386_Free(Module *modID, unsigned int channel);

Propriedades

Descrição

Esta função libera o canal channel usado pelo módulo modID.

Valor de retorno

0x03 - Setup

Sintaxe

int DMAController_i386_Setup(Module *modID, unsigned int channel, unsigned int bufferOffset, unsigned int size, int prop);

Propriedades

Descrição

Esta função configura o canal channel usado pelo módulo modID para poder transferir dados corretamente.

prop deve ser a soma do modo e do tipo de transferência.

O modo deve ser:

O tipo de transferência deve ser:

A leitura/escrita terá tamanho size bytes e vai começar do deslocamento bufferOffset dentro do buffer.

Para os canais de 5-7 bufferOffset deve ser um endereço par. Se for impar, o endereço par anterior será usado. Alem disso, size tem que ser par também.

Depois de configurar o DMA, o canal é liberado para ser usado pelo dispositivo.

Valor de retorno