home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.7z / ftp.whtech.com / emulators / v9t9 / linux / sources / V9t9 / source / Modules / dsr_rs232.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-10-19  |  4.8 KB  |  160 lines

  1. /*
  2.  *    RS232 definitions.
  3.  *
  4.  */
  5.  
  6. #ifndef __DSR_RS232_H__
  7. #define __DSR_RS232_H__
  8.  
  9. #include "OSLib.h"
  10.  
  11. #if UNDER_WIN32
  12. #define BUFFERED_RS232    0
  13. #else
  14. #define BUFFERED_RS232 1
  15. #endif
  16.  
  17. #define MAX_RS232_DEVS    2
  18. #define RS232_CRU_BASE    0x1300
  19.  
  20. extern    char        realrs232filename[OS_NAMESIZE];
  21. extern    char        rs232name[MAX_RS232_DEVS][OS_PATHSIZE];
  22.  
  23. /* The RS232 device is characterized by a dense packing of registers
  24.     into a small number of bits.  Depending on the settings of CRU
  25.     bits 11-14, a different register set is selected.  We use an array
  26.     to store these registers.  Also, certain bits are called "flag"
  27.     bits since writing their value instantiates the changes made to
  28.     the register.  This saves us a bit of time. */
  29.  
  30. #define uint unsigned int
  31.  
  32. typedef struct {
  33.     //    WRITE:
  34.     u16    loadctrl;        //     load control register: selects active register (0-15)
  35.     u16    wrbits;            //    bits written to 0...10
  36.  
  37.     //    wrbits copied here
  38.     u16    txchar;            //    [loadctrl=0] transmitted char
  39.     u16    xmitrate;        //    [loadctrl>=1] transmit rate register: timing
  40.     u16    rcvrate;        //    [loadctrl>=2] receive rate register: timing
  41.     #define RATE_DIV8    0x400
  42.     #define RATE_MASK    0x3ff
  43.  
  44.     u32    recvbps, xmitbps;    //    cached calculation for baud rate
  45.  
  46.     u16    invl;            //    [loadctrl>=4] interval register: ???
  47.     u16    ctrl;            //    [loadctrl>=8] control register: clock, parity, stop
  48.     #define CTRL_RCL0    1
  49.     #define CTRL_RCL1    2
  50.     #define CTRL_CLK4M    8
  51.     #define CTRL_Podd    16
  52.     #define CTRL_Penb    32
  53.     #define CTRL_SBS2    64        //    00 = 1.5, 01 = 2, 1X = 1
  54.     #define CTRL_SBS1    128        //
  55.  
  56.     u32        wrport;        //    bitmap for remaining write registers
  57.     #define    RS_RTSON    (1<<16)    //    [16] request to send
  58.     #define RS_BRKON    (1<<17)    //    [17] break on
  59.     #define RS_RIENB    (1<<18)    //    [18] receive interrupt enable
  60.     #define RS_XBIENB    (1<<19)    //    [19] xmit buffer interrupt enable
  61.     #define RS_TIMENB    (1<<20)    //    [20] timer interrupt enable
  62.     #define    RS_DSCENB    (1<<21)    //    [21] data status change interrupt enable
  63.     //    [22-30] unused
  64.  
  65.     #define    RS_RESET    (1<<31)    //    [31] reset
  66.  
  67.     //    READ:
  68.     u32    rdport;            //    bitmap for read registers
  69.  
  70.     #define    RS_RXCHAR    (0xff)    //    [0-7] received char
  71.  
  72.     //    [8] always zero
  73.     #define    RS_RCVERR    (1<<9)    //    [9] receive error
  74.     #define    RS_RPER        (1<<10)    //    [10] receive parity error
  75.     #define    RS_ROVER    (1<<11)    //    [11] receive overrun error
  76.     #define    RS_RFER        (1<<12)    //    [12] receive framing error
  77.     #define    RS_RFBD        (1<<13)    //    [13] receive full bit detect
  78.     #define    RS_RSBD        (1<<14)    //    [14] receive start bit detect
  79.     #define    RS_RIN        (1<<15)    //    [15] receive input
  80.     #define    RS_RBINT    (1<<16)    //    [16] receiver interrupt (rbrl - rienb)
  81.     #define    RS_XBINT    (1<<17)    //    [17] transmitter interrupt (xbre - xbienb)
  82.     //    [18] always zero
  83.     #define    RS_TIMINT    (1<<19)    //    [19] timer interrupt (timelp - timenb)
  84.     #define    RS_DSCINT    (1<<20)    //    [20] data set status change interrupt (dsch - dscenb)
  85.     #define    RS_RBRL        (1<<21)    //    [21] receive buffer register loaded
  86.     #define    RS_XBRE        (1<<22)    //    [22] transmit buffer register empty
  87.     #define    RS_XSRE        (1<<23)    //    [23] transmit shift register empty
  88.     #define    RS_TIMERR    (1<<24)    //    [24] time error
  89.     #define    RS_TIMELP    (1<<25)    //    [25] timer elapsed
  90.     #define    RS_RTS        (1<<26)    //    [26] request to send
  91.     #define    RS_DSR        (1<<27)    //    [27] data set ready
  92.     #define    RS_CTS        (1<<28)    //    [28] clear to send
  93.     #define    RS_DSCH        (1<<29)    //    [29] data set status change
  94.     #define    RS_FLAG        (1<<30)    //    [30] register load control flag set
  95.     #define    RS_INT        (1<<31)    //    [31] interrupt
  96.  
  97. #if BUFFERED_RS232
  98. // (500000/5/TM_HZ)        // max possible rate to deal with 
  99. #define BUF_SIZ     1024
  100. #define BUF_MASK     1023
  101.  
  102. #define BUFFER_EMPTY(rs,l)    (rs->l##_st == rs->l##_en)
  103. #define BUFFER_FULL(rs,l)    (rs->l##_st == ((rs->l##_en+1)&BUF_MASK))
  104.  
  105. #define BUFFER_LEFT(rs,l)    ((BUF_SIZ - rs->l##_st + rs->l##_en) & BUF_MASK)
  106.  
  107.     u8    xmit[BUF_SIZ], recv[BUF_SIZ];
  108.     u32    t_st,t_en, r_st, r_en;            // pointers to ring
  109. #endif
  110.  
  111. }    rs232regs;
  112.  
  113. #define RS_WORDSIZE(rs)        ((rs->ctrl & (CTRL_RCL0+CTRL_RCL1)) + 5)
  114.  
  115.  
  116. extern    rs232regs    rsregs[MAX_RS232_DEVS];
  117.  
  118. #undef uint
  119.  
  120. //    Returning vmXXX codes
  121. int        Init_RS232_SysDeps(void);
  122. int        Enable_RS232_SysDeps(void);
  123. int        Disable_RS232_SysDeps(void);
  124. int       Term_RS232_SysDeps(void);
  125.  
  126. void    Reset_RS232_SysDeps(rs232regs *rs);
  127. void    Set_CTRL_Register(rs232regs *rs);
  128. void    Set_INVL_Register(rs232regs *rs);
  129. void    Set_RCVRATE_Register(rs232regs *rs);
  130. void    Set_XMITRATE_Register(rs232regs *rs);
  131.  
  132. //    called for any change
  133. void    Set_Control_Bits(rs232regs *rs, u32 old, int bit);        // bits 16 to 21
  134.  
  135. #if !BUFFERED_RS232
  136. //    called once per character
  137. void    Transmit_Char(rs232regs *rs);
  138. #else
  139. //    called TM_HZ times per second
  140. void    Transmit_Chars(rs232regs *rs);
  141. #endif
  142.  
  143. //    called for any bit
  144. void    Read_Status_Bits(rs232regs *rs);
  145.  
  146. #if !BUFFERED_RS232
  147. //    called once at zero bit
  148. void    Receive_Data(rs232regs *rs);
  149. #else
  150. //    called TM_HZ times per second
  151. void    Receive_Chars(rs232regs *rs);
  152. #endif
  153.  
  154. #if BUFFERED_RS232
  155. //    called TM_HZ times per second
  156. void    Update_Modem_Lines(rs232regs *rs);
  157. #endif
  158.  
  159. #endif
  160.