#include "types.h" #include "dma.h" ushort mask_port[] = {0x0A, 0x0A, 0x0A, 0x0A, 0xD4, 0xD4, 0xD4, 0xD4}; ushort mode_port[] = {0x0B, 0x0B, 0x0B, 0x0B, 0xD6, 0xD6, 0xD6, 0xD6}; ushort clear_port[] = {0x0C, 0x0C, 0x0C, 0x0C, 0xD8, 0xD8, 0xD8, 0xD8}; ushort page_port[] = {0x87, 0x83, 0x81, 0x82, 0x8F, 0x8B, 0x89, 0x8A}; ushort addr_port[] = {0x00, 0x02, 0x04, 0x06, 0xC0, 0xC4, 0xC8, 0xCC}; ushort count_port[] = {0x01, 0x03, 0x05, 0x07, 0xC2, 0xC6, 0xCA, 0xCE}; void dma_start(uchar channel, struct dma_block_t *block, uchar mode) { mode |= (channel % 4); outportb(mask_port[channel], channel | DMA_SET_MASK_BIT); outportb(clear_port[channel], 0x00); outportb(mode_port[channel], mode); // FIXME outportw would work, no? outportb(addr_port[channel], block->offset & 0xFF); outportb(addr_port[channel], (block->offset >> 8) & 0xFF); outportb(page_port[channel], block->page); uint len = block->len - 1; outportb(count_port[channel], len & 0xFF); outportb(count_port[channel], (len >> 8) & 0xFF); outportb(mask_port[channel], channel | DMA_CLEAR_MASK_BIT); } void dma_pause(uchar channel) { outportb(mask_port[channel], channel | DMA_SET_MASK_BIT); } void dma_unpause(uchar channel) { outportb(mask_port[channel], channel | DMA_CLEAR_MASK_BIT); } void dma_stop(uchar channel) { outportb(mask_port[channel], channel | DMA_SET_MASK_BIT); outportb(clear_port[channel], 0x00); outportb(mask_port[channel], channel | DMA_CLEAR_MASK_BIT); }