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

Obsah / Ovladače / IRQ / Globální funkce ovladače řadiče IRQ

Zdrojový kód: DRIVERS\SYSTEM\IRQ.ASM


Globální funkce ovladače řadiče IRQ

Globální funkce ovladače řadiče IRQ se provádějí s implicitním ovladačem IRQ řadiče, jehož popisovač je uchován v proměnné IRQDevice.


; -----------------------------------------------------------------------------
;                   IRQ global function: Get IRQ channel info
; -----------------------------------------------------------------------------
; INPUT:	EAX = IRQ channel number
; OUTPUT:	ECX = number of channels
;		EDX = flags (see Channel info flags), 0=invalid channel
;		ESI = base interrupt
;		CY = invalid channel number (ECX and ESI are valid)
; NOTES:	It locks fast spin-lock of device interface.
; -----------------------------------------------------------------------------

IRQInfo:	push	ebx		; push EBX
		mov	ebx,[IRQDevice]	; EBX <- current IRQ device
		DEVFNCLOCKC DEVIRQ_Info	; get IRQ channel info
		pop	ebx		; pop EBX
		ret

Funkce IRQInfo slouží 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. 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 zajistí uzamknutí ovladače pomocí rychlého zámku.


; -----------------------------------------------------------------------------
;              IRQ global function: Remap base interrupt address
; -----------------------------------------------------------------------------
; INPUT:	EAX = new base interrupt (0 to 248, must be multiple of 8)
; OUTPUT:	CY = error (invalid base interrupt)
; NOTES:	All interrupts should be disabled first.
; 		It locks fast spin-lock of device interface.
; -----------------------------------------------------------------------------

IRQRemap:	push	ebx		; push EBX
		mov	ebx,[IRQDevice]	; EBX <- current IRQ device
		DEVFNCLOCKC DEVIRQ_Remap ; remap base interrupt address
		pop	ebx		; pop EBX
		ret

Funkce IRQRemap přemapuje základní vektor 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 a je v rozsahu 0 až 248. Před voláním funkce se doporučuje všechna přerušení zakázat. V případě chyby (neplatný vektor přerušení) navrátí funkce příznak chyby CY. Funkce zajistí uzamknutí ovladače pomocí rychlého zámku.


; -----------------------------------------------------------------------------
;                   IRQ global function: Enable IRQ channel
; -----------------------------------------------------------------------------
; INPUT:	EAX = IRQ channel number
; OUTPUT:	CY = invalid channel number or channel is already enabled
; NOTES:	It locks fast spin-lock of device interface.
; -----------------------------------------------------------------------------

IRQEnable:	push	ebx		; push EBX
		mov	ebx,[IRQDevice]	; EBX <- current IRQ device
		DEVFNCLOCKC DEVIRQ_Enable ; enable IRQ channel
		pop	ebx		; pop EBX
		ret

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


; -----------------------------------------------------------------------------
;                   IRQ global function: Disable IRQ channel
; -----------------------------------------------------------------------------
; INPUT:	EAX = IRQ channel number
; OUTPUT:	CY = invalid channel number or channel is already disabled
; NOTES:	It locks fast spin-lock of device interface.
; -----------------------------------------------------------------------------

IRQDisable:	push	ebx		; push EBX
		mov	ebx,[IRQDevice]	; EBX <- current IRQ device
		DEVFNCLOCKC DEVIRQ_Disable ; disable IRQ channel
		pop	ebx		; pop EBX
		ret

Funkce IRQDisable 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. V případě chyby (zadáno neplatné číslo kanálu nebo kanál je již zakázaný nebo se jedná o rezervovaný kaskádový kanál) navrátí funkce příznak chyby CY. Funkce zajistí uzamknutí ovladače pomocí rychlého zámku.


; -----------------------------------------------------------------------------
;             IRQ global function: Check if interrupt is pending
; -----------------------------------------------------------------------------
; INPUT:	EAX = IRQ channel number
; OUTPUT:	CY = interrupt is pending or invalid channel number
; NOTES:	It locks fast spin-lock of device interface.
; -----------------------------------------------------------------------------

IRQPending:	push	ebx		; push EBX
		mov	ebx,[IRQDevice]	; EBX <- current IRQ device
		DEVFNCLOCKC DEVIRQ_Pending ; check if interrupt is pending
		pop	ebx		; pop EBX
		ret

Funkce IRQPending 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. 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 zajistí uzamknutí ovladače pomocí rychlého zámku.


; -----------------------------------------------------------------------------
;             IRQ global function: Check if interrupt is in-service
; -----------------------------------------------------------------------------
; INPUT:	EAX = IRQ channel number
; OUTPUT:	CY = interrupt is in-service or invalid channel number
; NOTES:	It locks fast spin-lock of device interface.
; -----------------------------------------------------------------------------

IRQInServ:	push	ebx		; push EBX
		mov	ebx,[IRQDevice]	; EBX <- current IRQ device
		DEVFNCLOCKC DEVIRQ_InServ ; check if interrupt is in-service
		pop	ebx		; pop EBX
		ret

Funkce IRQInServ slouží ke zjištění, zda probíhá obsluha přerušení od IRQ kanálu, jehož číslo obsahuje na vstupu funkce registr EAX. 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 zajistí uzamknutí ovladače pomocí rychlého zámku.


; -----------------------------------------------------------------------------
;              IRQ global function: Acknowledge interrupt
; -----------------------------------------------------------------------------
; INPUT:	EAX = IRQ channel number
; OUTPUT:	CY = invalid channel number
; NOTES:	It locks fast spin-lock of device interface.
; -----------------------------------------------------------------------------

IRQAck:		push	ebx		; push EBX
		mov	ebx,[IRQDevice]	; EBX <- current IRQ device
		DEVFNCLOCKC DEVIRQ_Ack	; acknowledge interrupt
		pop	ebx		; pop EBX
		ret

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


Obsah / Ovladače / IRQ / Globální funkce ovladače řadiče IRQ