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

Obsah / Ovladače / TIMER / Struktury a makra ovladače časovače

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


Struktury a makra ovladače časovače


TIMER_FREQ	EQU	1193182		; TIMER frequency 1193181.8181 Hz
					;  = 1/3 of the NTSC color subcarrier

TIMER_IRQ	EQU	0		; TIMER IRQ number

; ------------- TIMER device descriptor

struc		DEVTIMER

		resb	DEV_size	; general device

DEVTIM_SetMode:	resd	1		; initialize counter
					;	INPUT:	EAX=mode (see below)
					;		EBX=device descriptor
					;		ECX=counter init. value
					;		EDX=counter index (0-2)
					;	OUTPUT:	CY=invalid arguments

DEVTIM_SetVal:	resd	1		; set new counter initial value
					;	INPUT:	EBX=device descriptor
					;		ECX=new counter value
					;		EDX=counter index (0-2)
					;	OUTPUT:	CY=invalid index

DEVTIM_GetVal:	resd	1		; get counter current value
					;	INPUT:	EBX=device descriptor
					;		EDX=counter index (0-2)
					;	OUTPUT:	EAX=counter cur. value
					;		CY=invalid index

DEVTIM_GetOut:	resd	1		; get counter output
					;	INPUT:	EBX=device descriptor
					;		EDX=counter index (0-2)
					;	OUTPUT:	EAX=counter OUT (0, 1)
					;		CY=invalid index

endstruc

%define DEV_TIMER_ID "TIM1"		; TIMER interface identifier

; ------------- Timer mode

DEVTIM_MODE_CNT	EQU	0		; mode 0: countdown
DEVTIM_MODE_SHT	EQU	1		; mode 1: hw retriggerable one-shot
DEVTIM_MODE_GEN	EQU	2		; mode 2(6): rate generator
DEVTIM_MODE_SQR	EQU	3		; mode 3(7): square wave
DEVTIM_MODE_SWS	EQU	4		; mode 4: sw triggered strobe
DEVTIM_MODE_HWS	EQU	5		; mode 5: hw triggered strobe

DEVTIM_MODE_MAX	EQU	7		; maximal mode number

Struktura DEVTIMER je popisovač ovladače časovače. Struktura je odvozena od všeobecného zařízení DEV.

DEVTIM_SetMode je funkce pro inicializaci čítače časovače. Na vstupu funkce obsahuje registr EAX požadovaný mód čítače (DEVTIM_MODE_CNT, ...), EBX popisovač ovladače časovače, registr ECX inicializační hodnotu čítače (v rozsahu 0 až 65536, přičemž hodnota 0 má význam hodnoty 65536) a registr EDX index čítače (v rozsahu 0 až 2). Čítač je vždy používán jako 16-bitový. V případě neplatného argumentu navrátí funkce příznak chyby CY. V módu DEVTIM_MODE_GEN je inicializační hodnota čítače 1 neplatná, ale není funkcí kontrolována platnost. Nastavením nového módu čítače se přeruší probíhající čítání a čítač se resetuje. Funkce trvá typicky zhruba 7 mikrosekund.

DEVTIM_SetVal je funkce k nastavení nové inicializační hodnoty čítače bez nastavení módu čítače a tedy bez resetování čítače. Nová inicializační hodnota čítače se uplatní zpravidla při následujícím cyklu. Na vstupu funkce obsahuje registr EBX popisovač ovladače časovače, registr ECX inicializační hodnotu čítače (v rozsahu 0 až 65536, přičemž hodnota 0 má význam hodnoty 65536) a registr EDX index čítače (v rozsahu 0 až 2). Čítač je vždy používán jako 16-bitový. V případě neplatného argumentu navrátí funkce příznak chyby CY. V módu DEVTIM_MODE_GEN je inicializační hodnota čítače 1 neplatná, ale není funkcí kontrolována platnost. Funkce trvá typicky zhruba 4 mikrosekundy.

DEVTIM_GetVal je funkce ke zjištění aktuální hodnoty čítače. Na vstupu funkce obsahuje registr EBX popisovač ovladače časovače a registr EDX index čítače (v rozsahu 0 až 2). Funkce vrací na výstupu v registru EAX aktuální hodnotu čítače. Čítač je vždy používán jako 16-bitový. V případě neplatného argumentu navrátí funkce příznak chyby CY. Funkce trvá typicky zhruba 7 mikrosekund.

DEVTIM_GetOut je funkce ke zjištění stavu výstupu OUT čítače. Na vstupu funkce obsahuje registr EBX popisovač ovladače časovače a registr EDX index čítače (v rozsahu 0 až 2). Funkce vrací na výstupu v registru EAX aktuální stav OUT čítače, hodnotu 0 nebo 1. V případě neplatného argumentu navrátí funkce příznak chyby CY (EAX = 0). Funkce trvá typicky zhruba 4 mikrosekundy. Funkce je podporována pouze u řadiče 8254 (standardní řadič v PC-AT) ale ne u 8253 (řadič používaný v PC-XT).

TIMER_FREQ je frekvence hodinového signálu časovače, tj. 1193182 Hz (přesněji 1193181,8181 Hz, což je 1/3 barvonosného signálu NTSC).

TIMER_IRQ je číslo přerušení používané časovačem (=IRQ 0).

Následují konstanty módu čítače.

DEVTIM_MODE_CNT (mód 0) je jednorázový čítač. Po inicializaci a zahájení čítání je výstup čítače ve stavu 0. Po dosažení nuly čítače přejde výstup do stavu 1. Po zápisu nové inicializační hodnoty se změní výstup opět na stav 0 a čítač začne čítat. Zápisem inicializační hodnoty během čítání se začne čítat také od začátku, tj. koncového stavu výstupu OUT je dosaženo vždy po přesně dané době od zápisu. Tento mód je používán jako monostabilní klopný obvod (tj. generátor impulsu dané délky) se softwarovým spouštěním.

DEVTIM_MODE_SHT (mód 1) je hardwarově spouštěný jednorázový čítač (jeden impuls). V klidu je výstup OUT ve stavu 1. Po inicializaci a nastavení čítače je čítač připraven k čítání. Spuštěním čítače vstupem GATE přejde výstup OUT do stavu 0 a zahájí se čítání. Po dosažení nuly přejde OUT zpět do stavu 1. Novým vstupem GATE se spustí nový impuls (bez nutnosti plnit znovu čítač). Zápisem nové hodnoty čítače během čítání se probíhající impuls neovlivní, nová hodnota se uplatní až při spuštění dalšího impulsu.

DEVTIM_MODE_GEN (mód 2 nebo 6) je generátor přerušení, dělička hodinového kmitočtu daným dělicím poměrem, nastaveným jako inicializační hodnota čítače. Běžně je výstup OUT ve stavu 1. Když čítač dosáhne hodnoty 1, přejde výstup OUT na stav 0 na dobu jednoho pulsu hodin. Poté nepřechází čítač na stav 0, ale naplní se znovu inicializační hodnotou čítače a pokračuje v čítání (výstup OUT přejde opět na stav 1). Zápisem nové inicializační hodnoty se nová hodnota uplatní až při čítání další sekvence. Inicializační hodnota 1 není v tomto módu povolená. Tento mód se běžně používá u čítače 0 ke generování přerušení hodinami.

DEVTIM_MODE_SQR (mód 3 nebo 7) je generátor obdélníkových impulsů. Tento mód je podobný předešlému módu s tím rozdílem, že výstup OUT přechází na stav 0 na polovinu doby čítače - výsledkem je tedy signál se střídou 1:1. Hodnota čítače (zarovnaná na sudé číslo) se snižuje po 2. Po dosažení nuly se překlopí stav výstupu OUT a čítání po 2 se opakuje. V případě liché inicializační hodnoty je OUT ve stavu 1 po dobu o 1 delší než ve stavu 0. Tento mód se běžně používá u čítače 2 ke generování zvukového signálu.

DEVTIM_MODE_SWS (mód 4) je softwarově spouštěný stroboskop. Výstup OUT je v základním stavu 1. Po dočítání nuly přejde na stav 0 na dobu jednoho pulsu hodin (slouží tedy k vyvolání přerušení po nastavené době) a pak se opět vrátí do stavu 1. Nové čítání je spuštěno zápisem nové inicializační hodnoty. Pokud je zápis proveden během čítání, spustí se po ukončení čítání další čítání s novou hodnotou.

DEVTIM_MODE_HWS (mód 5) je hardwarově spouštěný stroboskop. Je shodný s předešlým módem s tím rozdílem, že se čítání spouští náběžnou hranou vstupu GATE.


; ------------- Initialized TIMER device descriptor
; %1 = flags, %2 = major version, %3 = minor version,
; %4 = build version, %5 = name prefix ###
;	###SetMode = initialize counter
;	###SetVal = set new counter initial value
;	###GetVal = get counter current value
;	###GetOut = get counter output

%macro		DEVICETIMER 5

		DEVICE	DEVCLASS_SYS,DEV_SYS_TIMER,0,%1,%2,%3,%4,%5

		dd	%5 %+ SetMode	; initialize counter
		dd	%5 %+ SetVal	; set new counter initial value
		dd	%5 %+ GetVal	; get counter current value
		dd	%5 %+ GetOut	; get counter output

%endmacro

Makro DEVICETIMER je inicializovaný popisovač ovladače časovače. Makro má 5 parametrů:

%1 - příznaky

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

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

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

%5 - prefix jména ### :

###SetMode - inicializace čítače
###SetVal - nastavení inicializační hodnoty čítače
###GetVal - zjištění aktuální hodnoty čítače
###GetOut - zjištění stavu výstupu čítače


Obsah / Ovladače / TIMER / Struktury a makra ovladače časovače