Files
vxWorks/h/drv/timer/i8254.h
2025-08-20 18:25:46 +08:00

181 lines
5.1 KiB
C

/* i8254.h - intel 8254 timer header */
/*
modification history
--------------------
01h,25sep98,cdp added ARM support.
01g,24feb97,bjl moved #if CPU_FAMILY==MIPS after #ifdef __cplusplus
removed first #endif INCi8254h
added #endif CPU_FAMILY==MIPS
01f,22sep92,rrr added support for c++
01e,26may92,rrr the tree shuffle
01d,28oct91,wmd added #pragmas as defined by Intel.
01c,04oct91,rrr passed through the ansification filter
-fixed #else and #endif
-changed ASMLANGUAGE to _ASMLANGUAGE
-changed copyright notice
01b,20apr90,ajm merged in MIPS BSP version for now, must resolve later.
01a,20aug91,del installed.
*/
#ifndef __INCi8254h
#define __INCi8254h
#ifdef __cplusplus
extern "C" {
#endif
#if (CPU_FAMILY == MIPS) || (CPU_FAMILY == ARM)
/*
* INTERNAL
* On some BSPs, the output of counter2 drives the input to counters 0
* and 1. This mandates setup of counter2 before counters 0 and 1 can be
* programmed. On hkv3500, counter 2's input is being driven at 3.6864Mhz
* by the STAR card.
*/
#define PAD 3
#ifndef _ASMLANGUAGE
typedef struct {
unsigned char counter0;unsigned char pad0[PAD];/* counter 0 */
unsigned char counter1;unsigned char pad1[PAD];/* counter 1 */
unsigned char counter2;unsigned char pad2[PAD];/* counter 2 */
unsigned char cntrl_word;unsigned char pad3[PAD];/* control word */
}TIMER;
#endif /* _ASMLANGUAGE */
/*
* control word definitions
*/
#define CW_BCDMD 0x1 /* operate in BCD mode */
#define CW_COUNTLCH 0x00 /* counter latch command */
#define CW_LSBYTE 0x10 /* r/w least signif. byte only */
#define CW_MSBYTE 0x20 /* r/w most signif. byte only */
#define CW_BOTHBYTE 0x30 /* r/w 16 bits, lsb then msb */
#define CW_READBK 0xc0 /* read-back command */
#define CW_MODE(x) ((x)<<1) /* set mode to x */
#define CW_SELECT(x) ((x)<<6) /* select counter x */
/*
* Mode defs
*/
#define MD_TERMCOUNT 0x0 /* interrupt on terminal count */
#define MD_HWONESHOT 0x1 /* hw retriggerable one shot */
#define MD_RATEGEN 0x2 /* rate generator */
#define MD_SQUAREWV 0x3 /* square wave generator */
#define MD_SWTRIGSB 0x4 /* software triggered strobe */
#define MD_HWTRIGSB 0x5 /* hardware triggered strobe */
#else /* CPU_FAMILY==MIPS */
/******************************************************************/
/* Copyright (c) 1989, Intel Corporation
Intel hereby grants you permission to copy, modify, and
distribute this software and its documentation. Intel grants
this permission provided that the above copyright notice
appears in all copies and that both the copyright notice and
this permission notice appear in supporting documentation. In
addition, Intel grants this permission provided that you
prominently mark as not part of the original any modifications
made to this software or documentation, and that the name of
Intel Corporation not be used in advertising or publicity
pertaining to distribution of the software or the documentation
without specific, written prior permission.
Intel Corporation does not warrant, guarantee or make any
representations regarding the use of, or the results of the use
of, the software and documentation in terms of correctness,
accuracy, reliability, currentness, or otherwise; and you rely
on the software, documentation and results solely at your own
risk. */
/******************************************************************/
/*-------------------------------------------------------------*/
/*
* i8254.h header for 82c54-2 timer/counter
*
*/
/*-------------------------------------------------------------*/
#if CPU_FAMILY == I960
#pragma align 1
#endif
typedef volatile struct
{
unsigned char counter_0;
unsigned char counter_1;
unsigned char counter_2;
unsigned char control_word;
} I82C54;
#if CPU_FAMILY == I960
#pragma align 0
#endif
/* Control Word Format */
#define SC(sc) ((sc)<<6)
#define RW(rw) ((rw)<<4)
#define MODE(m) ((m)<<1)
#define BCD (1)
/* Control Words */
#define SEL_CNT_0 0x00
#define SEL_CNT_1 0x40
#define SEL_CNT_2 0x80
#define READ_BACK 0xc0
#define READ_BACK_0 0xc2
#define READ_BACK_1 0xc4
#define READ_BACK_2 0xc8
#define RW_LATCH 0x00
#define RW_LO_BYTE 0x10
#define RW_HI_BYTE 0x20
#define RW_HI_LO_BYTES 0x30
#define WRT_CNT_0_LO (SEL_CNT_0 | RW_LO_BYTE)
#define WRT_CNT_1_LO (SEL_CNT_1 | RW_LO_BYTE)
#define WRT_CNT_2_LO (SEL_CNT_2 | RW_LO_BYTE)
#define WRT_CNT_0_HI (SEL_CNT_0 | RW_HI_BYTE)
#define WRT_CNT_1_HI (SEL_CNT_1 | RW_HI_BYTE)
#define WRT_CNT_2_HI (SEL_CNT_2 | RW_HI_BYTE)
#define WRT_CNT_0_HI_LO (SEL_CNT_0 | RW_HI_LO_BYTES)
#define WRT_CNT_1_HI_LO (SEL_CNT_1 | RW_HI_LO_BYTES)
#define WRT_CNT_2_HI_LO (SEL_CNT_2 | RW_HI_LO_BYTES)
/* Readback Commands */
#define READBACK (3<<6)
#define LATCH_COUNT (1<<4)
#define LATCH_STATUS (1<<5)
#define CNT_0 (1<<1)
#define CNT_1 (1<<2)
#define CNT_2 (1<<3)
/* Status Bits */
#define OUTPUT_BIT (1<<7)
#define NULL_COUNT_BIT (1<<6)
#define RW1_BIT (1<<5)
#define RW0_BIT (1<<4)
#define M2_BIT (1<<3)
#define M1_BIT (1<<2)
#define M0_BIT (1<<1)
#define BCD_BIT (1<<0)
#endif /* CPU_FAMILY==MIPS */
#ifdef __cplusplus
}
#endif
#endif /* __INCi8254h */