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

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

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


Struktury a makra ovladače řadiče IRQ


; ------------- IRQ device descriptor

struc		DEVIRQ

		resb	DEV_size	; general device

DEVIRQ_Channels:resd	1		; number of IRQ channels
DEVIRQ_Base:	resd	1		; base interrupt (multiple of 8)
DEVIRQ_Cache:	resd	1		; interrupt mask cache (1=disabled)
DEVIRQ_Flags:	resd	1		; IRQ device flags (see below)
                                          
DEVIRQ_Info:	resd	1		; get IRQ channel info
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=invalid channel num.
					;		   (ECX and ESI valid)
					;		ECX=number of channels
					;		EDX=flags (see below)
					;		   (0=invalid channel)
					;		ESI=base interrupt

DEVIRQ_Remap:	resd	1		; remap base interrupt address
					;	INPUT:	EAX=new base interrupt
					;		EBX=device descriptor
					;	OUTPUT:	CY=error

DEVIRQ_Enable:	resd	1		; enable interrupt
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=invalid channel num.

DEVIRQ_Disable:	resd	1		; disable interrupt
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=invalid channel num.

DEVIRQ_Pending:	resd	1		; check if interrupt is pending
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=interrupt is pending

DEVIRQ_InServ:	resd	1		; check if interrupt is in-service
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=interrupt in-service

DEVIRQ_Ack:	resd	1		; acknowledge interrupt
					;	INPUT:	EAX=channel number
					;		EBX=device descriptor
					;	OUTPUT:	CY=invalid channel num.

endstruc

%define DEV_IRQ_ID "IRQ1"		; IRQ interface identifier

; ------------- IRQ device flags

DEVIRQ_InSrv1_b	EQU	0		; bit of DEVIRQ_InSrv1
DEVIRQ_InSrv1	EQU	(1 << DEVIRQ_InSrv1_b) ; ctrl 1 is in-service
DEVIRQ_InSrv2_b	EQU	1		; bit of DEVIRQ_InSrv1
DEVIRQ_InSrv2	EQU	(1 << DEVIRQ_InSrv2_b) ; ctrl 2 is in-service

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

IRQINFO_VALID	EQU	B0		; channel is valid (else invalid)
IRQINFO_ENABLED	EQU	B1		; channel is enabled (else disabled)

Struktura DEVIRQ je popisovač ovladače řadiče přerušení. Struktura je odvozena od všeobecného zařízení DEV.

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

DEVIRQ_Base je interní proměnná ovladače (nemělo by k ní být přistupováno přímo) obsahující číslo základního vektoru přerušení. Představuje číslo vektoru přerušení prvního signálu IRQ0, ostatní přerušení sekvenčně následují. Číslo základního vektoru přerušení musí být násobkem čísla 8.

DEVIRQ_Cache je interní proměnná ovladače (nemělo by k ní být přistupováno přímo) s uschovanou maskou přerušení. Je-li bit nastaven na hodnotu 1, je příslušné přerušení zakázáno.

DEVIRQ_Flags je interní proměnná ovladače (nemělo by k ní být přistupováno přímo) s pomocnými příznaky. Je-li nastaven příznak DEVIRQ_InSrv1, je řadič 1 v režimu in-service. Je-li nastaven příznak DEVIRQ_InSrv2, je řadič 2 v režimu in-service.

DEVIRQ_Info je funkce ke zjištění informací o IRQ kanálu. Na vstupu funkce obsahuje registr EAX číslo kanálu IRQ, 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ů IRQ, v registru ESI číslo základního vektoru přerušení a v registru EDX příznaky (nebo jejich kombinace) s těmito hodnotami: IRQINFO_VALID kanál je platný, IRQINFO_ENABLED kanál je povolen (může nastat přerušení). V případě neplatného čísla IRQ kanálu navrátí funkce příznak CY a obsah registru EDX je nulový. Počet kanálů navrácený v registru ECX a bázový vektor v registru ESI jsou i v případě chyby platné. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVIRQ_Remap slouží k nastavení nového základního vektoru přerušení. Na vstupu funkce obsahuje registr EAX nový základní vektor přerušení. Číslo základního vektoru přerušení musí být násobkem čísla 8. Registr EBX obsahuje popisovač zařízení. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

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

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

Funkce DEVIRQ_Pending slouží ke zjištění, zda je připravený požadavek přerušení od IRQ kanálu, jehož číslo obsahuje na vstupu funkce registr EAX. Registr EBX obsahuje popisovač zařízení. Na výstupu funkce je navrácen příznak CY, pokud je požadavek přerušení připraven nebo pokud bylo zadáno neplatné číslo kanálu. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVIRQ_InServ slouží ke zjištění, zda probíhá obsluha přerušení od IRQ kanálu, jehož číslo obsahuje na vstupu funkce registr EAX. Registr EBX obsahuje popisovač zařízení. Na výstupu funkce je navrácen příznak CY, pokud probíhá obsluha přerušení od IRQ kanálu nebo pokud bylo zadáno neplatné číslo kanálu. Funkce vyžaduje uzamknutí pomocí rychlého zámku.

Funkce DEVIRQ_Ack slouží k potvrzení požadavku přerušení od IRQ kanálu, jehož číslo obsahuje na vstupu funkce registr EAX. Registr EBX obsahuje popisovač zařízení. V případě chyby (zadáno neplatné číslo kanálu) navrátí funkce příznak chyby CY. Funkce vyžaduje uzamknutí pomocí rychlého zámku.


; ------------- Initialized IRQ 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 IRQ channel info
;	###Remap = remap base interrupt address
;	###Enable = enable IRQ channel
;	###Disable = disable IRQ channel
;	###Pending = check if IRQ is pending
;	###InServ = check if IRQ is in-service
;	###Ack = acknowledge IRQ

%macro		DEVICEIRQ 7

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

		dd	%6		; number of channels
		dd	INT_FIRST	; base interrupt
		dd	-1		; cache of interrupt mask
		dd	0		; IRQ device flags

		dd	%7 %+ Info	; get IRQ channel info
		dd	%7 %+ Remap	; remap base interrupt address
		dd	%7 %+ Enable	; enable IRQ channel
		dd	%7 %+ Disable	; disable IRQ channel
		dd	%7 %+ Pending	; check if IRQ is pending
		dd	%7 %+ InServ	; check if IRQ is in-service
		dd	%7 %+ Ack	; acknowledge (and disable) interrupt

%endmacro

Makro DEVICEIRQ je inicializovaný popisovač ovladače řadiče přerušení. 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 IRQ kanálů

%7 - prefix jména ### :

###Info - zjištění informací o IRQ kanálu
###Remap - přemapování základního vektoru přerušení
###Enable - povolení IRQ kanálu
###Disable - zákaz IRQ kanálu
###Pending - test, zda je požadavek přerušení od IRQ kanálu
###InServ - test, zda probíhá obsluha přerušení od IRQ kanálu
###Ack - potvrzení přerušení od IRQ kanálu


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