Date: Tue, 22 Jul 1997 15:32:17 +0200 (MET DST) From: Luigi Rizzo <luigi@labinfo.iet.unipi.it> To: hackers@freebsd.org, multimedia@freebsd.org Subject: polling the status of a dma channel Message-ID: <199707221332.PAA22798@labinfo.iet.unipi.it>
next in thread | raw e-mail | index | archive | help
Recently I and others had a need to poll the status of a dma channel to determine if a transfer was proceeding or not. I came out with the following function which I placed in /sys/i386/isa/isa.c -- the place I believe it belongs to. Maybe we should consider adding this function to isa.c ? It would be useful for the sound driver and probably other drivers as well. Cheers Luigi ------------- /* * isa_dmapoll returns the number of pending bytes for a dma transfer * on the given channel. */ int isa_dmapoll(int chan) { u_long phy = 0 ; u_long cnt = 0 ; u_long flags ; int waport; if (dma_inuse & (1 << chan) == 0) { printf("chan %d not acquired\n", chan); return -1 ; } if (dma_busy & (1 << chan) == 0) { printf("chan %d not busy\n", chan); return -2 ; } flags = splhigh(); if ((chan & 4) == 0) { /* 8-bit channel */ outb(DMA1_FFC, 0); waport = DMA1_CHN(chan); phy= inb(waport) + (inb(waport) <<8) + (inb(dmapageport[chan]) <<16 ); cnt = inb(waport+1) + (inb(waport+1)<<8) +1; cnt &= 0xffff ; } else { outb(DMA2_FFC, 0); waport = DMA2_CHN(chan - 4); phy= inb(waport) + (inb(waport) <<8) + (inb(dmapageport[chan]) <<16 ); cnt = inb(waport+1) + (inb(waport+1)<<8) + 1; phy <<= 1; cnt <<= 1; cnt &= 0x1ffff ; } splx(flags); return cnt ; } Cheers Luigi -----------------------------+-------------------------------------- Luigi Rizzo | Dip. di Ingegneria dell'Informazione email: luigi@iet.unipi.it | Universita' di Pisa tel: +39-50-568533 | via Diotisalvi 2, 56126 PISA (Italy) fax: +39-50-568522 | http://www.iet.unipi.it/~luigi/ _____________________________|______________________________________
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199707221332.PAA22798>