timerreg.h

Go to the documentation of this file.
00001 /*-
00002  * Copyright (c) 1993 The Regents of the University of California.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. All advertising materials mentioning features or use of this software
00014  *    must display the following acknowledgement:
00015  *      This product includes software developed by the University of
00016  *      California, Berkeley and its contributors.
00017  * 4. Neither the name of the University nor the names of its contributors
00018  *    may be used to endorse or promote products derived from this software
00019  *    without specific prior written permission.
00020  *
00021  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
00022  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00023  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00024  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
00025  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00026  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00027  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00028  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00029  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00030  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00031  * SUCH DAMAGE.
00032  */
00033 #ifndef __TIMERREG_H__
00034 #define __TIMERREG_H__  1
00035 
00036 /*
00037  * Register definitions for the Intel 8253 Programmable Interval Timer.
00038  *
00039  * This chip has three independent 16-bit down counters that can be
00040  * read on the fly.  There are three mode registers and three countdown
00041  * registers.  The countdown registers are addressed directly, via the
00042  * first three I/O ports.  The three mode registers are accessed via
00043  * the fourth I/O port, with two bits in the mode byte indicating the
00044  * register.  (Why are hardware interfaces always so braindead?).
00045  *
00046  * To write a value into the countdown register, the mode register
00047  * is first programmed with a command indicating the which byte of
00048  * the two byte register is to be modified.  The three possibilities
00049  * are load msb (TMR_MR_MSB), load lsb (TMR_MR_LSB), or load lsb then
00050  * msb (TMR_MR_BOTH).
00051  *
00052  * To read the current value ("on the fly") from the countdown register,
00053  * you write a "latch" command into the mode register, then read the stable
00054  * value from the corresponding I/O port.  For example, you write
00055  * TMR_MR_LATCH into the corresponding mode register.  Presumably,
00056  * after doing this, a write operation to the I/O port would result
00057  * in undefined behavior (but hopefully not fry the chip).
00058  * Reading in this manner has no side effects.
00059  *
00060  * The outputs of the three timers are connected as follows:
00061  *
00062  *       timer 0 -> irq 0
00063  *       timer 1 -> dma chan 0 (for dram refresh)
00064  *       timer 2 -> speaker (via keyboard controller)
00065  *
00066  * Timer 0 is used to call hardclock.
00067  * Timer 2 is used to generate console beeps.
00068  */
00069 
00070 
00071 /*
00072  * Frequency of all three count-down timers; (TIMER_FREQ/freq) is the
00073  * appropriate count to generate a frequency of freq hz.
00074  */
00075 #ifndef TIMER_FREQ
00076 #define TIMER_FREQ      1193182
00077 #endif
00078 #define TIMER_DIV(x) ((TIMER_FREQ+(x)/2)/(x))
00079 
00080 /*
00081  * Macros for specifying values to be written into a mode register.
00082  */
00083 #define TIMER_CNTR0     (IO_TIMER1 + 0) /* timer 0 counter port */
00084 #define TIMER_CNTR1     (IO_TIMER1 + 1) /* timer 1 counter port */
00085 #define TIMER_CNTR2     (IO_TIMER1 + 2) /* timer 2 counter port */
00086 #define TIMER_MODE      (IO_TIMER1 + 3) /* timer mode port */
00087 #define         TIMER_SEL0      0x00    /* select counter 0 */
00088 #define         TIMER_SEL1      0x40    /* select counter 1 */
00089 #define         TIMER_SEL2      0x80    /* select counter 2 */
00090 #define         TIMER_INTTC     0x00    /* mode 0, intr on terminal cnt */
00091 #define         TIMER_ONESHOT   0x02    /* mode 1, one shot */
00092 #define         TIMER_RATEGEN   0x04    /* mode 2, rate generator */
00093 #define         TIMER_SQWAVE    0x06    /* mode 3, square wave */
00094 #define         TIMER_SWSTROBE  0x08    /* mode 4, s/w triggered strobe */
00095 #define         TIMER_HWSTROBE  0x0a    /* mode 5, h/w triggered strobe */
00096 #define         TIMER_LATCH     0x00    /* latch counter for reading */
00097 #define         TIMER_LSB       0x10    /* r/w counter LSB */
00098 #define         TIMER_MSB       0x20    /* r/w counter MSB */
00099 #define         TIMER_16BIT     0x30    /* r/w counter 16 bits, LSB first */
00100 #define         TIMER_BCD       0x01    /* count in BCD */
00101 
00102 #endif

Generated on Wed May 24 23:05:52 2006 for LSE/OS by  doxygen 1.4.6