Interface: DMAController_i386 Arquivos: dmacontroller_i386.h Última atualização: 08/06/2005 Autor: Luiz Henrique Shigunov |
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 |
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:
Canal | Usado por |
---|---|
0 | livre/refresh da memória |
1 | livre |
2 | controlador de disquete |
3 | livre |
4 | usado para ligar o escravo no mestre |
5 | livre |
6 | livre |
7 | livre |
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.
Estas funções são de uso exclusivo dos módulos do sistema.
void *DMAController_i386_Alloc(Module *modID, unsigned int channel, unsigned int bufferSize);
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.
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
int DMAController_i386_Free(Module *modID, unsigned int channel);
Esta função libera o canal channel usado pelo módulo modID.
int DMAController_i386_Setup(Module *modID, unsigned int channel, unsigned int bufferOffset, unsigned int size, int prop);
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.