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