Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Ovladače / DMA / Struktury a makra ovladače řadiče DMA

Zdrojový kód: INCLUDE\DRIVERS\SYSTEM\DMA.INC


Struktury a makra ovladače řadiče DMA


; ------------- DMA device descriptor

struc		DEVDMA

		resb	DEV_size	; general device

DEVDMA_Channels:resd	1		; number of DMA channels
DEVDMA_Used:	resd	1		; mask of used channels (0=available)
DEVDMA_Running:	resd	1		; mask of running channels

DEVDMA_Info:	resd	1		; get DMA channel info
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=invalid channel num.
					;		  (ECX is valid)
					;		ECX=number of channels
					;		EDX=flags (see below)
					;		   (0=invalid channel)

DEVDMA_Alloc:	resd	1		; allocate DMA channel
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=cannot allocate

DEVDMA_Free:	resd	1		; free DMA channel
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=error

DEVDMA_Start:	resd	1		; start DMA transfer
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;		ECX=number of bytes
					;		EDX=system address
					;		ESI=DMA direction
					;	OUTPUT:	CY=invalid argument
					;	NOTES:	Cannot cross 64K
					;		boundary. Max. size 64K
					;		and address and size
					;		must be word aligned.
					;		Only lower 16MB of mem.

DEVDMA_Stop:	resd	1		; stop DMA transfer
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;		CY=error

DEVDMA_Remain:	resd	1		; get remaining transfer size
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	ECX=remaining bytes
					;		CY=error

DEVDMA_Check:	resd	1		; check if transfer is still running
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=error or not running
endstruc

%define DEV_DMA_ID "DMA1"		; DMA interface identifier

; ------------- DMA direction (hardcoded in DMAModeTab)

DMADIR_READ	EQU	0		; read from device
DMADIR_WRITE	EQU	1		; write to device
DMADIR_VERIFY	EQU	2		; verify data from device

DMADIR_NUM	EQU	3		; number of DMA directions

; ------------- Channel info flags (0=invalid channel)

DMAINFO_VALID	EQU	B0		; channel is valid (else invalid)
DMAINFO_USED	EQU	B1		; channel is used (else free)
DMAINFO_RUNNING	EQU	B2		; channel is running (else stopped)
DMAINFO_8BIT	EQU	B3		; channel is 8-bit (else 16-bit)
DMAINFO_BOUND	EQU	B4		; must not cross 64K boundary (or 128K)
DMAINFO_ALIGN	EQU	B5		; must be word aligned (or need not be)
DMAINFO_16M	EQU	B6		; limited to lower 16 MB of memory

DMAINFO_CH0_3	EQU	DMAINFO_VALID+DMAINFO_8BIT+DMAINFO_BOUND+\
				DMAINFO_ALIGN+DMAINFO_16M
DMAINFO_CH4_7	EQU	DMAINFO_VALID+DMAINFO_BOUND+DMAINFO_ALIGN+DMAINFO_16M

Struktura DEVDMA je popisovač ovladače řadiče přímého přístupu k paměti DMA. Struktura je odvozena od všeobecného zařízení DEV.

DEVDMA_Channels je interní proměnná ovladače (nemělo by k ní být přistupováno přímo) obsahující počet DMA kanálů řadiče.

DEVDMA_Used je interní proměnná ovladače (nemělo by k ní být přistupováno přímo) s maskou použitých (vlastněných) kanálů. Je-li bit nastaven na hodnotu 1, je příslušný kanál používán (vlastněn). Při hodnotě 0 je kanál volný k dispozici.

DEVDMA_Running je interní proměnná ovladače (nemělo by k ní být přistupováno přímo) s maskou probíhajících přenosů. Je-li bit nastaven na hodnotu 1, probíhá na příslušném DMA kanále přenos dat. Při hodnotě 0 se žádná data nepřenáší.

DEVDMA_Info je funkce ke zjištění informací o DMA kanálu. Na vstupu funkce obsahuje registr EAX číslo kanálu DMA, pro který mají být informace zjištěny. Registr EBX obsahuje popisovač zařízení. Na výstupu z funkce je navrácen v registru ECX počet kanálů DMA a v registru EDX příznaky (nebo jejich kombinace) s těmito hodnotami: DMAINFO_VALID kanál je platný, DMAINFO_USED kanál je používán (vlastněn), DMAINFO_RUNNING na kanálu probíhá přenos dat, DMAINFO_8BIT kanál je 8-bitový (jinak 16-bitový), DMAINFO_BOUND blok dat nesmí překrýt hranici adres 64 KB (jinak 128 KB), DMAINFO_ALIGN adresa musí být zarovnána na slovo, DMAINFO_16M limitace na nižších 16 MB paměti. V případě neplatného čísla DMA kanálu navrátí funkce příznak CY a obsah registru EDX je nulový. Počet kanálů navrácený v registru ECX je i v případě chyby platný. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVDMA_Alloc slouží k alokaci (přivlastnění) DMA kanálu. Na vstupu funkce obsahuje registr EAX číslo kanálu DMA, který má být alokován. Registr EBX obsahuje popisovač zařízení. V případě chyby (kanál je již alokován nebo zadáno neplatné číslo kanálu) navrátí funkce příznak chyby CY. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVDMA_Free slouží k dealokaci (uvolnění) DMA kanálu. Na vstupu funkce obsahuje registr EAX číslo kanálu DMA, který má být uvolněn. Registr EBX obsahuje popisovač zařízení. V případě chyby (kanál není alokován nebo zadáno neplatné číslo kanálu nebo probíhá přenos dat) navrátí funkce příznak chyby CY. Není kontrolováno, zda kanál uvolňuje stejný vlastník, který si zažádal o jeho alokaci. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVDMA_Start odstartuje DMA přenos dat. Na vstupu funkce obsahuje registr EAX číslo kanálu DMA, na kterém má být přenos odstartován. Registr EBX obsahuje popisovač zařízení. V registru ECX je nastaven počet bajtů k přenosu, v registru EDX adresa paměti v systému (tedy ne fyzické paměti) a v registru ESI je příznak směru přenosu: DMADIR_READ čtení ze zařízení, DMADIR_WRITE zápis na zařízení a DMADIR_VERIFY je verifikace dat ze zařízení. Současná verze ovladače má následující omezení: blok dat nesmí překrýt hranici adres 64 KB, maximální velikost bloku 64 KB, minimální velikost bloku 2 B, velikost musí být zarovnaná na slovo, adresa musí být zarovnaná na slovo a lze používat pouze nižších 16 MB fyzické paměti (blok získaný pomocí funkce DMAMemAlloc). V případě neplatného zadání některého z argumentů navrátí funkce příznak chyby CY. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVDMA_Stop zastaví DMA přenos dat. Na vstupu funkce obsahuje registr EAX číslo kanálu DMA, jehož přenos dat má být zastaven. Registr EBX obsahuje popisovač zařízení. V případě chyby (zadáno neplatné číslo kanálu nebo přenos dat neprobíhá) navrátí funkce příznak chyby CY. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVDMA_Remain zjistí zbývající počet bajtů k přenosu. Na vstupu funkce obsahuje registr EAX číslo kanálu DMA, pro který má být počet bajtů zjištěn. Registr EBX obsahuje popisovač zařízení. Na výstupu funkce je v registru ECX navrácen zbývající počet bajtů k přenosu. V případě chyby (zadáno neplatné číslo kanálu nebo přenos dat neprobíhá) navrátí funkce příznak chyby CY. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVDMA_Check slouží ke zjištění, zda probíhá přenos dat na DMA kanálu, jehož číslo obsahuje na vstupu funkce registr EAX. Na výstupu funkce je navrácen příznak CY, pokud přenos dat neprobíhá nebo byl zadán neplatný DMA kanál. Funkce se používá jako rychlejší varianta k testu přenosu než DEVDMA_Remain. Funkce vyžaduje uzamknutí pomocí rychlého zámku.


; ------------- Initialized DMA device descriptor
; %1 = device index, %2 = flags, %3 = major version, %4 = minor version,
; %5 = build version, %6 = number of channels, %7 = name prefix ###
;	###Info = get DMA channel info
;	###Alloc = allocate DMA channel
;	###Free = free DMA channel
;	###Start = start DMA transfer
;	###Stop = stop DMA transfer
;	###Remain = get remaining transfer size
;	###Check = check if transfer is still running

%macro		DEVICEDMA 7

		DEVICE	DEVCLASS_SYS,DEV_SYS_DMA,%1,%2,%3,%4,%5,%7

		dd	%6		; number of channels
		dd	-1		; mask of used channels
		dd	0		; mask of running channels

		dd	%7 %+ Info	; get DMA channel info
		dd	%7 %+ Alloc	; allocate DMA channel
		dd	%7 %+ Free	; free DMA channel
		dd	%7 %+ Start	; start DMA transfer
		dd	%7 %+ Stop	; stop DMA transfer
		dd	%7 %+ Remain	; get remaining transfer size
		dd	%7 %+ Check	; check if transfer is still running
%endmacro

Makro DEVICEDMA je inicializovaný popisovač ovladače řadiče přímého přístupu k paměti DMA. Makro má 7 parametrů:

%1 - index zařízení

%2 - příznaky

%3 - hlavní číslo verze ovladače

%4 - vedlejší číslo verze ovladače

%5 - číslo překladu ovladače

%6 - počet DMA kanálů

%7 - prefix jména ### :

###Info - zjištění informací o DMA kanálu
###Alloc - alokace DMA kanálu
###Free - uvolnění DMA kanálu
###Start - start DMA přenosu
###Stop - stop DMA přenosu
###Remain - zjištění zbylých dat k přenosu
###Check - zjištění, zda dosud probíhá přenos dat


Obsah / Ovladače / DMA / Struktury a makra ovladače řadiče DMA