home *** CD-ROM | disk | FTP | other *** search
- /*
- * RS232 definitions.
- *
- */
-
- #ifndef __DSR_RS232_H__
- #define __DSR_RS232_H__
-
- #include "OSLib.h"
-
- #if UNDER_WIN32
- #define BUFFERED_RS232 0
- #else
- #define BUFFERED_RS232 1
- #endif
-
- #define MAX_RS232_DEVS 2
- #define RS232_CRU_BASE 0x1300
-
- extern char realrs232filename[OS_NAMESIZE];
- extern char rs232name[MAX_RS232_DEVS][OS_PATHSIZE];
-
- /* The RS232 device is characterized by a dense packing of registers
- into a small number of bits. Depending on the settings of CRU
- bits 11-14, a different register set is selected. We use an array
- to store these registers. Also, certain bits are called "flag"
- bits since writing their value instantiates the changes made to
- the register. This saves us a bit of time. */
-
- #define uint unsigned int
-
- typedef struct {
- // WRITE:
- u16 loadctrl; // load control register: selects active register (0-15)
- u16 wrbits; // bits written to 0...10
-
- // wrbits copied here
- u16 txchar; // [loadctrl=0] transmitted char
- u16 xmitrate; // [loadctrl>=1] transmit rate register: timing
- u16 rcvrate; // [loadctrl>=2] receive rate register: timing
- #define RATE_DIV8 0x400
- #define RATE_MASK 0x3ff
-
- u32 recvbps, xmitbps; // cached calculation for baud rate
-
- u16 invl; // [loadctrl>=4] interval register: ???
- u16 ctrl; // [loadctrl>=8] control register: clock, parity, stop
- #define CTRL_RCL0 1
- #define CTRL_RCL1 2
- #define CTRL_CLK4M 8
- #define CTRL_Podd 16
- #define CTRL_Penb 32
- #define CTRL_SBS2 64 // 00 = 1.5, 01 = 2, 1X = 1
- #define CTRL_SBS1 128 //
-
- u32 wrport; // bitmap for remaining write registers
- #define RS_RTSON (1<<16) // [16] request to send
- #define RS_BRKON (1<<17) // [17] break on
- #define RS_RIENB (1<<18) // [18] receive interrupt enable
- #define RS_XBIENB (1<<19) // [19] xmit buffer interrupt enable
- #define RS_TIMENB (1<<20) // [20] timer interrupt enable
- #define RS_DSCENB (1<<21) // [21] data status change interrupt enable
- // [22-30] unused
-
- #define RS_RESET (1<<31) // [31] reset
-
- // READ:
- u32 rdport; // bitmap for read registers
-
- #define RS_RXCHAR (0xff) // [0-7] received char
-
- // [8] always zero
- #define RS_RCVERR (1<<9) // [9] receive error
- #define RS_RPER (1<<10) // [10] receive parity error
- #define RS_ROVER (1<<11) // [11] receive overrun error
- #define RS_RFER (1<<12) // [12] receive framing error
- #define RS_RFBD (1<<13) // [13] receive full bit detect
- #define RS_RSBD (1<<14) // [14] receive start bit detect
- #define RS_RIN (1<<15) // [15] receive input
- #define RS_RBINT (1<<16) // [16] receiver interrupt (rbrl - rienb)
- #define RS_XBINT (1<<17) // [17] transmitter interrupt (xbre - xbienb)
- // [18] always zero
- #define RS_TIMINT (1<<19) // [19] timer interrupt (timelp - timenb)
- #define RS_DSCINT (1<<20) // [20] data set status change interrupt (dsch - dscenb)
- #define RS_RBRL (1<<21) // [21] receive buffer register loaded
- #define RS_XBRE (1<<22) // [22] transmit buffer register empty
- #define RS_XSRE (1<<23) // [23] transmit shift register empty
- #define RS_TIMERR (1<<24) // [24] time error
- #define RS_TIMELP (1<<25) // [25] timer elapsed
- #define RS_RTS (1<<26) // [26] request to send
- #define RS_DSR (1<<27) // [27] data set ready
- #define RS_CTS (1<<28) // [28] clear to send
- #define RS_DSCH (1<<29) // [29] data set status change
- #define RS_FLAG (1<<30) // [30] register load control flag set
- #define RS_INT (1<<31) // [31] interrupt
-
- #if BUFFERED_RS232
- // (500000/5/TM_HZ) // max possible rate to deal with
- #define BUF_SIZ 1024
- #define BUF_MASK 1023
-
- #define BUFFER_EMPTY(rs,l) (rs->##l##_st == rs->##l##_en)
- #define BUFFER_FULL(rs,l) (rs->##l##_st == ((rs->##l##_en+1)&BUF_MASK))
-
- #define BUFFER_LEFT(rs,l) ((BUF_SIZ - rs->##l##_st + rs->##l##_en) & BUF_MASK)
-
- u8 xmit[BUF_SIZ], recv[BUF_SIZ];
- u32 t_st,t_en, r_st, r_en; // pointers to ring
- #endif
-
- } rs232regs;
-
- #define RS_WORDSIZE(rs) ((rs->ctrl & (CTRL_RCL0+CTRL_RCL1)) + 5)
-
-
- extern rs232regs rsregs[MAX_RS232_DEVS];
-
- #undef uint
-
- // Returning vmXXX codes
- int Init_RS232_SysDeps(void);
- int Enable_RS232_SysDeps(void);
- int Disable_RS232_SysDeps(void);
- int Term_RS232_SysDeps(void);
-
- void Reset_RS232_SysDeps(rs232regs *rs);
- void Set_CTRL_Register(rs232regs *rs);
- void Set_INVL_Register(rs232regs *rs);
- void Set_RCVRATE_Register(rs232regs *rs);
- void Set_XMITRATE_Register(rs232regs *rs);
-
- // called for any change
- void Set_Control_Bits(rs232regs *rs, u32 old, int bit); // bits 16 to 21
-
- #if !BUFFERED_RS232
- // called once per character
- void Transmit_Char(rs232regs *rs);
- #else
- // called TM_HZ times per second
- void Transmit_Chars(rs232regs *rs);
- #endif
-
- // called for any bit
- void Read_Status_Bits(rs232regs *rs);
-
- #if !BUFFERED_RS232
- // called once at zero bit
- void Receive_Data(rs232regs *rs);
- #else
- // called TM_HZ times per second
- void Receive_Chars(rs232regs *rs);
- #endif
-
- #if BUFFERED_RS232
- // called TM_HZ times per second
- void Update_Modem_Lines(rs232regs *rs);
- #endif
-
- #endif
-