| Zeile 211: |
Zeile 211: |
| | |} | | |} |
| | | | |
| − | === Beispielcode ===
| |
| − | Folgende Funktion bereitet eine Übertragung vor:
| |
| − | <c>
| |
| − | #define CHANNEL_ADRESS 0x04
| |
| − | #define CHANNEL_COUNTER 0x05
| |
| − | #define CHANNEL_PAGE 0x81
| |
| | | | |
| − | VOID dma_begin_transfer(VOID* buffer, WORD size, BOOL write)
| + | == Weblinks == |
| − | {
| + | * [http://en.wikipedia.org/wiki/Direct_memory_access DMA-Artikel in der englischen Wikipedia] |
| − | BYTE page = (DWORD) buffer >> 16;
| + | * [http://www.oreilly.de/german/freebooks/linuxdrive2ger/memdma.html DMA anhand des Linux-Kernels erklärt] |
| − | WORD offset = (DWORD) buffer - (page<<16);
| |
| − | size--;
| |
| − | | |
| − | mask_channel(2);
| |
| − | | |
| − | clear_flip_flop();
| |
| − | outb(CHANNEL_COUNTER, size);
| |
| − | outb(CHANNEL_COUNTER, size>>8);
| |
| − |
| |
| − | clear_flip_flop();
| |
| − | outb(CHANNEL_ADRESS, offset & 0xFF);
| |
| − | outb(CHANNEL_ADRESS, offset>>8);
| |
| − | outb(CHANNEL_PAGE, page);
| |
| − | | |
| − | if (write)
| |
| − | outb(DMA_MODE, MODE_MASK_CHANNEL2 | MODE_MASK_TRANSFER_WRITE | MODE_MASK_MODE_SINGLE); // | MODE_MASK_AUTO);
| |
| − | else
| |
| − | outb(DMA_MODE, MODE_MASK_CHANNEL2 | MODE_MASK_TRANSFER_READ | MODE_MASK_MODE_SINGLE); // | MODE_MASK_AUTO);
| |
| − | | |
| − | unmask_channel(2);
| |
| − | }
| |
| − | </c>
| |
| | | | |
| | [[Kategorie:Glossar]] | | [[Kategorie:Glossar]] |
| | [[Kategorie:Hardware]] | | [[Kategorie:Hardware]] |
| | [[en:DMA]] | | [[en:DMA]] |