COBE 0.1 ALPHA
|
00001 #include <dma.h> 00002 #include <stdint.h> 00003 #include <io.h> 00004 00029 void set_dma_transfer(uint8_t channel, uint16_t size, void* buffer, bool write_on) { 00030 00031 if(channel < 4) { 00032 outb(0x0A, channel | 0x4); //----------Maskiert den Channel---------- 00033 if(write_on == true) outb(0x0B, channel | 0x8 | 0x10 | 0x40); else outb(0x0B, channel | 0x4 | 0x10 | 0x40); //----------Setzt den Modus der Übertragung---------- 00034 } else { 00035 outb(0xD4, channel | 0x4); //----------Maskiert den Channel---------- 00036 if(write_on == true) outb(0xD6, channel | 0x8 | 0x10 | 0x40); else outb(0xD6, channel | 0x4 | 0x10 | 0x40); 00037 } 00038 size--; 00039 uint8_t page = (uint32_t) buffer >> 16; 00040 uint16_t offset = (uint32_t) buffer - (page << 16); 00041 00042 outb(0x0C, 0x1); outb(0xD8, 0x1); //----------Resettet die FlipFlop-Register---------- 00043 00044 outb(0x81, page); //----------Schreibt die Page-ID in den Port---------- 00045 outb(0x04, offset & 0xFF); //----------Der Offset wird in zwei Teilen zu je einem Byte geschrieben---------- 00046 outb(0x04, offset >> 8); 00047 00048 outb(0x0C, 0x1); outb(0xD8, 0x1); //----------Resettet die FlipFlop-Register---------- 00049 00050 outb(0x05, size & 0xFF); //----------Die Anzahl der zu übertragenden Bytes wird in einzelnen Teilen übertragen---------- 00051 outb(0x05, size >> 8); 00052 outb(0x0A, channel); outb(0xD4, channel); //----------Demaskiert den Channel---------- 00053 }