/*++ Copyright (c) 2000 Microsoft Corporation Module Name: io_cmos.h Abstract: This module contains a variety of constants, function prototypes, inline functions and external data declarations used by code to access the CMOS/ECMOS and well-known, standard I/O ports. Author: Forrest Foltz (forrestf) 24-Oct-2000 --*/ #ifndef _IO_CMOS_H_ #define _IO_CMOS_H_ // // Constants used to initialize timer 0 // #if defined(NEC_98) #define TIMER_CONTROL_PORT (PUCHAR)0x3fdf #define TIMER_DATA_PORT (PUCHAR)0x3fdb #define TIMER_CLOCK_IN 0x2457600 #define TIMER_CONTROL_SELECT 0x76 #define SPEAKER_CONTROL_PORT (PUCHAR)0x61 #define SPEAKER_OFF 0x07 #define SPEAKER_ON 0x06 #else #define TIMER1_DATA_PORT0 (PUCHAR)0x40 // Timer1, channel 0 data port #define TIMER1_DATA_PORT1 (PUCHAR)0x41 // Timer1, channel 1 data port #define TIMER1_DATA_PORT2 (PUCHAR)0x42 // Timer1, channel 2 data port #define TIMER1_CONTROL_PORT (PUCHAR)0x43 // Timer1 control port #define TIMER2_DATA_PORT0 (PUCHAR)0x48 // Timer2, channel 0 data port #define TIMER2_CONTROL_PORT (PUCHAR)0x4B // Timer2 control port #define TIMER_COMMAND_COUNTER0 0x00 // Select channel 0 #define TIMER_COMMAND_COUNTER1 0x40 // Select channel 1 #define TIMER_COMMAND_COUNTER2 0x80 // Select channel 2 #define TIMER_COMMAND_RW_16BIT 0x30 // Read/Write LSB firt then MSB #define TIMER_COMMAND_MODE2 4 // Use mode 2 #define TIMER_COMMAND_MODE3 6 #define TIMER_COMMAND_BCD 0 // Binary count down #define TIMER_COMMAND_LATCH_READ 0 // Latch read command #define TIMER_CLOCK_IN 1193167 #define SPEAKER_CONTROL_PORT (PCHAR)0x61 #define SPEAKER_OFF_MASK 0xFC #define SPEAKER_ON_MASK 0x03 #endif // // CMOS ports // #define CMOS_ADDRESS_PORT (PCHAR)0x70 #define CMOS_DATA_PORT (PCHAR)0x71 #define ECMOS_ADDRESS_PORT_LSB (PCHAR)0x74 #define ECMOS_ADDRESS_PORT_MSB (PCHAR)0x75 #define ECMOS_DATA_PORT (PCHAR)0x76 #define CMOS_STATUS_A 0x0A #define CMOS_STATUS_B 0x0B #define CMOS_STATUS_C 0x0C #define CMOS_STATUS_D 0x0D #define CMOS_STATUS_BUSY 0x80 #define CMOS_STATUS_BANK1 0x10 #define CMOS_BANK_1 0x100 #define RTC_OFFSET_SECOND 0 #define RTC_OFFSET_SECOND_ALARM 1 #define RTC_OFFSET_MINUTE 2 #define RTC_OFFSET_MINUTE_ALARM 3 #define RTC_OFFSET_HOUR 4 #define RTC_OFFSET_HOUR_ALARM 5 #define RTC_OFFSET_DAY_OF_WEEK 6 #define RTC_OFFSET_DATE_OF_MONTH 7 #define RTC_OFFSET_MONTH 8 #define RTC_OFFSET_YEAR 9 #define RTC_OFFSET_CENTURY_MCA 0x37 #define RTC_OFFSET_CENTURY 0x32 #define RTC_OFFSET_CENTURY_DS 0x148 #define REGISTER_B_DAYLIGHT_SAVINGS_TIME (1 << 0) #define REGISTER_B_24HOUR_MODE (1 << 1) #define REGISTER_B_ENABLE_ALARM_INTERRUPT (1 << 5) #define REGISTER_B_ENABLE_PERIODIC_INTERRUPT (1 << 6) VOID HalpIoDelay ( VOID ); #define IO_DELAY() HalpIoDelay() // // CMOS-related function prototypes // VOID HalpAcquireCmosSpinLockAndWait( VOID ); // // Inline functions // __inline UCHAR BIN_TO_BCD ( UCHAR Value ) /*++ Routine Description: This function converts an 8-bit binary value to an packed, 8-bit, two-digit BCD value. Arguments: Value - supplies the binary value to convert. Return Value: Returns a two-digit packed BCD representation of Value. --*/ { UCHAR tens; UCHAR units; tens = Value / 10; units = Value % 10; return (tens << 4) + units; } __inline UCHAR BCD_TO_BIN ( UCHAR Value ) /*++ Routine Description: This function converts a packed, 8-bit, two-digit BCD value to an 8-bit binary value. Arguments: Value - supplies the BCD value to convert. Return Value: Returns a binary representation of Value. --*/ { UCHAR tens; UCHAR units; tens = (Value >> 4) & 0x0F; units = Value & 0x0F; return tens * 10 + units; } __inline UCHAR CMOS_READ ( UCHAR Address ) /*++ Routine Description: This function reads a CMOS byte. Arguments: Address - supplies the CMOS address of the value to retrieve. Return Value: Returns the value residing in CMOS at Address. --*/ { UCHAR data; UCHAR oldAddress; // // Record the current control port contents, write the address, // read the data, and restore the control port contents. // oldAddress = READ_PORT_UCHAR(CMOS_ADDRESS_PORT); WRITE_PORT_UCHAR(CMOS_ADDRESS_PORT,Address); IO_DELAY(); data = READ_PORT_UCHAR(CMOS_DATA_PORT); WRITE_PORT_UCHAR(CMOS_ADDRESS_PORT,oldAddress); IO_DELAY(); return data; } __inline VOID CMOS_WRITE ( UCHAR Address, UCHAR Data ) /*++ Routine Description: This function writes a CMOS byte. Arguments: Address - supplies the CMOS address of the value to retrieve. Data - supplies the value to write at the supplied address. Return Value: None. --*/ { UCHAR oldAddress; // // Record the current control port contents, write the address, // write the data, and restore the control port contents. // oldAddress = READ_PORT_UCHAR(CMOS_ADDRESS_PORT); WRITE_PORT_UCHAR(CMOS_ADDRESS_PORT,Address); IO_DELAY(); WRITE_PORT_UCHAR(CMOS_DATA_PORT,Data); WRITE_PORT_UCHAR(CMOS_ADDRESS_PORT,oldAddress); IO_DELAY(); } __inline UCHAR CMOS_READ_BCD ( UCHAR Address ) /*++ Routine Description: This function reads a CMOS byte as a two-digit packed BCD value and returns its binary representation. Arguments: Address - supplies the CMOS address of the BCD value to retrieve. Return Value: Returns the binary representation of the BCD value residing in CMOS at Address. --*/ { UCHAR value; value = CMOS_READ(Address); return BCD_TO_BIN(value); } __inline VOID CMOS_WRITE_BCD ( UCHAR Address, UCHAR Value ) /*++ Routine Description: This function writes a CMOS byte as a two-digit packed BCD value. Arguments: Address - supplies the CMOS address of the BCD value to write. Value - supplies the binary representation of the value to write in CMOS. Return Value: None. --*/ { UCHAR value; ASSERT(Value <= 99); value = BIN_TO_BCD(Value); CMOS_WRITE(Address,value); } __inline VOID WRITE_PORT_USHORT_PAIR ( IN PUCHAR LsbPort, IN PUCHAR MsbPort, IN USHORT Value ) /*++ Routine Description: This function retrieves a USHORT value by reading two UCHAR values, each from one of two supplied 8 bit ports. NOTE - the LsbPort is read first, followed by the MsbPort. Arguments: LsbPort - supplies the port address from which to retrieve the least significant UCHAR value. MsbPort - supplies the port address from which to retrieve the most significant UCHAR value. Return Value: Returns the resultant USHORT value. --*/ { WRITE_PORT_UCHAR(LsbPort,(UCHAR)Value); IO_DELAY(); WRITE_PORT_UCHAR(MsbPort,(UCHAR)(Value >> 8)); } __inline USHORT READ_PORT_USHORT_PAIR ( IN PUCHAR LsbPort, IN PUCHAR MsbPort ) /*++ Routine Description: This function retrieves a USHORT value by reading two UCHAR values, each from one of two supplied 8 bit ports. NOTE - the LsbPort is read first, followed by the MsbPort. Arguments: LsbPort - supplies the port address from which to retrieve the least significant UCHAR value. MsbPort - supplies the port address from which to retrieve the most significant UCHAR value. Return Value: Returns the resultant USHORT value. --*/ { UCHAR lsByte; UCHAR msByte; lsByte = READ_PORT_UCHAR(LsbPort); IO_DELAY(); msByte = READ_PORT_UCHAR(MsbPort); return (USHORT)lsByte | ((USHORT)msByte << 8); } extern ULONG HalpCmosCenturyOffset; extern UCHAR HalpRtcRegA; extern UCHAR HalpRtcRegB; #endif