Obsah / Ovladače / CMOS / Struktury a makra ovladače paměti CMOS
Zdrojový kód: INCLUDE\DRIVERS\SYSTEM\CMOS.INC
Struktury a makra ovladače paměti CMOS
|
Struktura DEVCMOS je popisovač ovladače paměti CMOS. Struktura je odvozena od všeobecného zařízení DEV.
DEVCMOS_GetByte je funkce pro načtení jednoho bajtu z paměti CMOS. Na vstupu funkce obsahuje registr EBX popisovač ovladače paměti CMOS a registr EDX index bajtu k načtení (v rozsahu 0 až 127). Na výstupu z funkce je navrácena v registru EAX hodnota načteného bajtu (v rozsahu 0 až 255). Je-li zadán neplatný index, navrátí funkce příznak chyby CY. Funkce trvá typicky zhruba 4 mikrosekundy.
DEVCMOS_SetByte je funkce pro zápis jednoho bajtu do paměti CMOS. Na vstupu funkce obsahuje registr AL hodnotu dat k zápisu, registr EBX popisovač ovladače paměti CMOS a registr EDX index bajtu k zápisu (v rozsahu 0 až 127). Je-li zadán neplatný index, navrátí funkce příznak chyby CY. Funkce trvá typicky zhruba 4 mikrosekundy.
DEVCMOS_GetData je funkce pro načtení dat z paměti CMOS. Na vstupu funkce obsahuje registr EAX ukazatel na datový buffer, registr EBX popisovač ovladače paměti CMOS, registr ECX počet bajtů k načtení (0 až 128) a registr EDX počáteční index dat k načtení (v rozsahu 0 až 127). Je-li zadán neplatný index nebo velikost dat, navrátí funkce příznak chyby CY.
DEVCMOS_SetData je funkce pro zápis dat do paměti CMOS. Na vstupu funkce obsahuje registr EAX ukazatel na datový buffer, registr EBX popisovač ovladače paměti CMOS, registr ECX počet bajtů k zápisu (0 až 128) a registr EDX počáteční index dat k zápisu (v rozsahu 0 až 127). Je-li zadán neplatný index nebo velikost dat, navrátí funkce příznak chyby CY.
DEVCMOS_GetTime je funkce pro načtení aktuálního data a času z paměti CMOS. Na vstupu funkce obsahuje registr EBX popisovač ovladače paměti CMOS a registr EDX ukazatel na buffer DATETIME, do kterého bude aktuální datum a čas načten. Jsou-li údaje v CMOS neplatné nebo pokud probíhá update cyklus času je navrácen příznak chyby CY. I v případě navrácené chyby jsou údaje z paměti CMOS načteny. Update cyklus znamená, že probíhá inkrementace času hodin a je potřeba čekat na jeho dokončení. Doba čekání se může pohybovat až do 2 milisekund. Položka dne v týdnu může být u některých PC neplatná a proto je sice načítána, ale není kontrolována na platnost. Je-li potřeba časový údaj načíst přesně, je třeba opakovaným čtením synchronizovat okamžik, kdy se zvýší údaj sekund. Funkce trvá typicky zhruba 40 mikrosekund.
DEVCMOS_SetTime je funkce pro zápis aktuálního data a času do paměti CMOS. Na vstupu funkce obsahuje registr EBX popisovač ovladače paměti CMOS a registr EDX ukazatel na buffer DATETIME, obsahující aktuální datum a čas (včetně dne v týdnu). V případě chyby funkce navrací příznak CY (v současné verzi driveru je vždy NC). První inkrementace času nastane 0,5 sekundy po zápisu času - při přesné synchronizaci času je proto potřeba čas nastavit v době za 0,5 sekundy po uběhnutí požadovaného času. Funkce trvá typicky zhruba 50 mikrosekund.
DEVCMOS_GetAlrm je funkce pro načtení času alarmu z paměti CMOS. Na vstupu funkce obsahuje registr EBX popisovač ovladače paměti CMOS a registr EDX ukazatel na buffer DATETIME, do kterého bude čas alarmu načten. Na výstupu funkce jsou v registru EAX navráceny příznaky (ALARM_ENABLED, ...). V případě chyby funkce vrací příznak CY (v současné verzi driveru je vždy NC). Nepoužité položky struktury jsou inicializovány na údaj 0:00:00 1/1/1. Funkce trvá typicky 20 mikrosekund.
DEVCMOS_SetAlrm je funkce pro zápis času alarmu do paměti CMOS. Na vstupu funkce obsahuje registr EAX příznaky (ALARM_ENABLED,...), EBX popisovač ovladače paměti CMOS a registr EDX ukazatel na buffer DATETIME, obsahující čas alarmu. V případě chyby funkce navrací příznak CY (v současné verzi driveru je vždy NC). Funkce trvá typicky zhruba 20 mikrosekund.
Alarm slouží k probuzení počítače v zadanou dobu. Standardně lze nastavit hodinu, minutu a sekundu času k probuzení, přičemž jednotlivé údaje mohou být nastaveny jako neplatné a nejsou kontrolovány. Např. nastavením údaje hodin na neplatné se bude počítač budit každou hodinu. Některé počítače umožňují nastavení ještě dne v týdnu nebo data alarmu, ale toto nastavení není systémem podporováno - lze ovšem vyřešit nastavením data alarmu v BIOS a poté aktivaci alarmu a nastavení času alarmu provádět v systému.
DEVCMOS_GetRate je funkce pro zjištění rychlosti periodického přerušení. Na vstupu funkce obsahuje registr EBX popisovač ovladače paměti CMOS. Na výstupu funkce navrací v registru EAX rychlost přerušení - hodnotu CMOS_RATE_NONE, CMOS_RATE_8K atd. V případě chyby funkce navrací příznak CY (v současné verzi driveru je vždy NC). Funkce trvá typicky zhruba 8 mikrosekund.
DEVCMOS_SetRate je funkce pro nastavení rychlosti periodického přerušení. Na vstupu funkce obsahuje registr EAX rychlost přerušení (hodnota CMOS_RATE_NONE, CMOS_RATE_8K atd.), EBX popisovač ovladače paměti CMOS. V případě chybného argumentu navrací funkce příznak chyby CY. CMOS_RATE_NONE přerušení zakáže, ostatní hodnoty přerušení povolí. Funkce trvá typicky zhruba 12 mikrosekund.
DEVCMOS_AckInt je funkce pro potvrzení periodického přerušení. Funkce je volána z obsluhy periodického přerušení. Informuje řadič hodin reálného času o zpracování přerušení, čímž umožní aktivaci příštího přerušení. Potvrzení přerušení se provádí čtením stavového registru C hodin reálného času. Na vstupu funkce obsahuje registr EBX popisovač ovladače paměti CMOS. Funkce trvá typicky zhruba 4 mikrosekundy.
DEVCMOS_NextNMI je funkce k reaktivaci dalšího nemaskovatelného přerušení po obsloužení nemaskovatelného přerušení. Na vstupu funkce obsahuje registr EBX popisovač ovladače paměti CMOS.
CMOS_IRQ je číslo přerušení používané hodinami reálného času (= IRQ 8).
Následující příznaky se používají ve funkcích pro obsluhu alarmu: ALARM_ENABLED je příznak, že alarm je aktivní (tj. že v danou dobu dojde ke vzbuzení počítače). ALARM_USE_SEC udává platnost položky sekund, jinak nastává probuzení nezávisle na údaji sekund (tj. každou sekundu). ALARM_USE_MIN udává platnost položky minut, jinak nastává probuzení nezávisle na údaji minut (tj. každou minutu). ALARM_USE_HOUR udává platnost položky hodin, jinak nastává probuzení nezávisle na údaji hodin (tj. každou hodinu). Další příznaky jsou rezervované pro budoucí použití a v současné verzi systému nepoužité: ALARM_USE_DAYW (položka dne v týdnu je platná) atd.
Položky CMOS_RATE_NONE, CMOS_RATE_8K atd. jsou konstanty udávající rychlost periodického přerušení. CMOS_RATE_8K je přerušení s frekvencí 8192 Hz, CMOS_RATE_2 je přerušení 2x za sekund. CMOS_RATE_NONE přerušení zakáže, ostatní hodnoty přerušení povolí.
|
Výše uvedený seznam symbolů představuje popis struktury paměti CMOS, tj. význam jednotlivých registrů. Položky času mohou být buď v BCD kódu (tj. první číslice je v horní tetrádě bajtu a druhá číslice v dolní tetrádě) nebo v binárním kódu, závisle na nastavení bitu RTC_BIN stavového registru CMOS_STATUS_B. Ovladač při přístupu k času údaje automaticky převádí.
CMOS_SEC je údaj sekund aktuálního času v rozsahu 0 - 59h (mód BCD) nebo 0 - 59 (mód BIN). Bit 7 je read-only, nelze měnit.
CMOS_ALARM_SEC je údaj sekund alarmu v rozsahu 0 - 59h (mód BCD) nebo 0 - 59 (mód BIN). Má-li údaj hodnotu 0C0h až 0FFh, dochází k aktivací alarmu nezávisle na sekundách (tj. každou sekundu).
CMOS_MIN je údaj minut aktuálního času v rozsahu 0 - 59h (mód BCD) nebo 0 - 59 (mód BIN).
CMOS_ALARM_MIN je údaj minut alarmu v rozsahu 0 - 59h (mód BCD) nebo 0 - 59 (mód BIN). Má-li údaj hodnotu 0C0h až 0FFh, dochází k aktivací alarmu nezávisle na minutách (tj. každou minutu).
CMOS_HOUR je údaj hodin aktuálního času. V módu 24 hodin je údaj v rozsahu 0 - 23h (mód BCD) nebo 0 - 23 (mód BIN). V módu 12 hodin je údaj v rozsahu 1 - 12h (mód BCD) nebo 1 - 12 (mód BIN) a bit 7 označuje 1=PM (odpoledne), 0=AM (dopoledne). Ovladač podporuje pouze mód 24 hodin.
CMOS_ALARM_HOUR je údaj hodin alarmu. V módu 24 hodin je údaj v rozsahu 0 - 23h (mód BCD) nebo 0 - 23 (mód BIN). V módu 12 hodin je údaj v rozsahu 1 - 12h (mód BCD) nebo 1 - 12 (mód BIN) a bit 7 označuje 1=PM (odpoledne), 0=AM (dopoledne). Ovladač podporuje pouze mód 24 hodin. Má-li údaj hodnotu 0C0h až 0FFh, dochází k aktivací alarmu nezávisle na hodinách (tj. každou hodinu).
CMOS_DAYWEEK představuje aktuální den v týdnu. Hodnota 1 znamená neděli, hodnota 7 sobotu. U některých PC může být údaj nastaven na hodnotu neodpovídající aktuálnímu datu nebo na hodnotu mimo uvedený rozsah.
CMOS_DAY je aktuální den v měsíci (datum) v rozsahu 1 - 31h (mód BCD) nebo 1 - 31 (mód BIN).
CMOS_MONTH je aktuální měsíc v rozsahu 1 - 12h (mód BCD) nebo 1 - 12 (mód BIN).
CMOS_YEAR jsou poslední 2 číslice ve století aktuálního roku v rozsahu 0 - 99h (mód BCD) nebo 0 - 99 (mód BIN).
CMOS_STATUS_A je stavový a řídicí registr A hodin reálného času. Bity 0 až 3 nastavují frekvenci přerušení (od 2 = 16384 Hz až po 15 = 2 Hz), bity 4 až 6 nastavují 22-stupňový dělič (0=4 MHz, 1=1 MHz, 2=23 KHz, 6 a 7=reset). Bit 7 (= RTC_UIP) indikuje, že probíhá aktualizační cyklus času, tj, že v této době může být čas v neurčitém stavu. Příznak aktualizace je zapnut 248 us před zahájením změny a může trvat až 2 ms.
CMOS_STATUS_B je stavový a řídicí registr B hodin reálného času. Bit 0 povoluje přepínání mezi letním a zimním časem. Bit 1 indikuje 24-hodinový mód času (jinak 12 hodin). Bit 2 (RTC_BIN) přepíná čas mezi BCD módem (=0) a BIN módem (=1). Bit 3 povoluje výstup obdélníkových vln. Bit 4 aktivuje přerušení vyvolané po ukončení aktualizoačního cyklu hodin. Bit 5 (RTC_AIE) povolí alarm (tj. probuzení počítače v daný čas). Bit 6 povolí opakované přerušení. Bit 7 (RTC_SET) přechodně zakáže aktualizaci času během nastavování času.
CMOS_STATUS_C je stavový registr C hodin reálného času (lze jen číst). Bit 4 indikuje, že nastalo přerušení po ukončení aktualizačního cyklu. Bit 5 indikuje, že nastalo přerušení alarmem. Bit 6 indikuje opakované přerušení. Bit 7 indikuje, že některé z přerušení nastalo a přerušení je současně povolené.
CMOS_STATUS_D je stavový registr D hodin reálného času (lze jen číst). Bit 7 indikuje dobré napětí záložní baterie.
CMOS_DIAG je diagnostický stavový bajt.
CMOS_RESET je kód pro reset.
CMOS_FLOPPY je typ disketové mechaniky A: a B.
CMOS_REG_DEF je implicitní registr používaný k aktivaci nemaskovatelného přerušení - je zvolen takový registr, aby nechtěným přepisem datového portu CMOS nedošlo k nežádoucí modifikaci CMOS paměti.
|
Makro DEVICECMOS je inicializovaný popisovač ovladače paměti CMOS. Makro má 6 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 - prefix jména ### :
###GetByte - načtení bajtu z paměti CMOS
###SetByte - uložení bajtu do paměti CMOS
###GeData - načtení dat z paměti CMOS
###SetData - uložení dat do paměti CMOS
###GetTime - načtení data a času z paměti CMOS
###SetTime - uložení data a času do paměti CMOS
###GetAlrm - načtení alarmu z paměti CMOS
###SetAlrm - uložení alarmu do paměti CMOS
###GetRate - zjištění rychlosti periodického přerušení
###SetRate - nastavení rychlosti periodického přerušení
###AckInt - potvrzení periodického přerušení
###NextNMI - nová aktivace NMI
Obsah / Ovladače / CMOS / Struktury a makra ovladače paměti CMOS