Direct Memory Access — Änderungen 9979 → 10699

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]]