Annotation of xinu/sys/slu7201.c, revision 1.1.1.1

1.1       root        1: #include <slu7201.h>
                      2: 
                      3: /* Package to turn the write-only control registers of each of up to MAXSLU/2
                      4:    NEC7201 SLUs into effectively read-write registers, and also initialize
                      5:    the SLU for 8 bits, no parity, 1 stop bit, 9600 baud, no interrupts.
                      6:    To be effective, all references to the control registers need to go
                      7:    through this package. */
                      8: 
                      9: /* space for 2 sets of saved regs, for each channel of one 7201-- */
                     10: #define MAXSLU 2
                     11: 
                     12: static struct {
                     13:   struct csr *csrptr;          /* which SLU this is */
                     14:   char vals[6];                        /* its 6 control reg vals */
                     15: }soft_control_reg[MAXSLU] = {0};
                     16: 
                     17: /* initialize UART regs to do async 8 bits, no parity, 1 stop bit, no ints */
                     18: /* save control reg settings in soft_control_reg for later access */
                     19: int slu_init7201(struct csr *csrptr)
                     20: {
                     21:   int i;
                     22: 
                     23:   /* lookup csr or set up new spot in array-- */
                     24:   for (i=0;i<MAXSLU;i++) {
                     25:     if (soft_control_reg[i].csrptr == (struct csr *)0) {
                     26:       soft_control_reg[i].csrptr = csrptr; /* new spot */
                     27:       break;
                     28:     } else if (soft_control_reg[i].csrptr == csrptr)
                     29:       break;
                     30:   }
                     31:   if (i==MAXSLU)
                     32:     panic("Too many SLU devs for soft_control_reg table");
                     33: 
                     34:   csrptr->cstat = 0;           /* select reg 0 */
                     35:   csrptr->cstat = 0;           /* for sure */
                     36:   csrptr->cstat = SLURESET;
                     37:   for (i=0;i<10;i++);          /* little delay */
                     38:   soft_control_reg[i].vals[0] = 0;
                     39:   csrptr->cstat = 2;
                     40:   csrptr->cstat = SLUCREG2DEF;
                     41:   soft_control_reg[i].vals[2] = SLUCREG2DEF;
                     42:   csrptr->cstat = 4;
                     43:   csrptr->cstat = SLUCREG4DEF;
                     44:   soft_control_reg[i].vals[4] = SLUCREG4DEF;
                     45:   csrptr->cstat = 1;
                     46:   csrptr->cstat = SLUCREG1DEF;
                     47:   soft_control_reg[i].vals[1] = SLUCREG1DEF;
                     48:   csrptr->cstat = 3;
                     49:   csrptr->cstat = SLUCREG3DEF;
                     50:   soft_control_reg[i].vals[3] = SLUCREG3DEF;
                     51:   csrptr->cstat = 5;
                     52:   csrptr->cstat = SLUCREG5DEF|SLUCREG5DTR;
                     53:   soft_control_reg[i].vals[5] = SLUCREG5DEF|SLUCREG5DTR;
                     54:   csrptr->cstat = 0;           /* leave with reg 0 selected */
                     55:   *SLUSELECT9600 = 0;          /* write to magic addr for 9600 baud */
                     56:   delay7201();                 /* don't use right away */
                     57:   return 0;
                     58: }
                     59: 
                     60: set_baudrate(int baudrate)
                     61: {
                     62:   switch (baudrate) {
                     63:   case 1200: *SLUSELECT1200 = 0;
                     64:     break;
                     65:   case 2400: *SLUSELECT2400 = 0;
                     66:     break;
                     67:   case 4800: *SLUSELECT4800 = 0;
                     68:     break;
                     69:   case 9600: *SLUSELECT9600 = 0;
                     70:     break;
                     71:   case 19200: *SLUSELECT19200 = 0;
                     72:     break;
                     73:   case 38400: *SLUSELECT38400 = 0;
                     74:     break;
                     75:   default:  return -1;
                     76:   }
                     77:   return 0;
                     78: }
                     79: 
                     80: delay7201()
                     81: {
                     82:   int i;
                     83: 
                     84:   for (i=0;i<10000;i++)
                     85:        ;
                     86: }
                     87: 
                     88: /* call this to get current control reg contents-- */
                     89: get_control_reg7201(csrptr,reg)
                     90: struct csr *csrptr;    /* ptr to device csr */
                     91: {
                     92:   int i;
                     93: 
                     94:   for (i=0;i<MAXSLU;i++)
                     95:     if (soft_control_reg[i].csrptr == csrptr)
                     96:       return soft_control_reg[i].vals[reg];
                     97:   panic("Bad csrptr or uninitialized SLU");
                     98: }
                     99: 
                    100: /* must be called to change control reg, so that software var is maintained */
                    101: set_control_reg7201(csrptr,new_control,reg)
                    102: struct csr *csrptr;
                    103: char new_control;
                    104: {
                    105:   int i;
                    106: 
                    107:   for (i=0;i<MAXSLU;i++)
                    108:     if (soft_control_reg[i].csrptr == csrptr)
                    109:       break;
                    110:   if (i==MAXSLU)
                    111:     panic("Bad csrptr or uninitialized SLU");
                    112: 
                    113:   if (reg==0) {
                    114:     if (new_control&SLUREGMASK) /* better not set another reg! */
                    115:       panic("Inconsistent use of set_control_reg7201");
                    116:     else                       /* OK, do it */
                    117:       csrptr->cstat = new_control;
                    118:   }
                    119:   else {                       /* reg>0--select reg, do it, reselect reg 0 */
                    120:     csrptr->cstat = reg;       /* select reg */
                    121:     csrptr->cstat = new_control;
                    122:     csrptr->cstat = 0;         /*  back to reg 0 */
                    123:   }
                    124:   delay7201();                 /* let 7201 have time to process cmd */
                    125:   soft_control_reg[i].vals[reg] = new_control;
                    126:   return 0;
                    127: }
                    128: /* used by slutenable macro--reenable transmit ints if necessary,
                    129:    start output with null char */
                    130: slu_tstart7201(csrptr)
                    131: struct csr *csrptr;
                    132: {
                    133:   short savesr,creg1;
                    134:   int i;
                    135: 
                    136:   for (i=0;i<MAXSLU;i++)
                    137:     if (soft_control_reg[i].csrptr == csrptr)
                    138:       break;
                    139:   if (i==MAXSLU)
                    140:     panic("Bad csrptr or uninitialized SLU");
                    141: 
                    142:   _disable(&savesr);           /* make sure test,set of int bit is atomic  */
                    143:   if ((creg1 = soft_control_reg[i].vals[1])&SLUTRANSIE) {
                    144:     _restore(&savesr);
                    145:     return;                    /* already going */
                    146:   }
                    147:   while ((csrptr->cstat&SLUTRANSREADY)==0) ; /* make sure transmitter idle */
                    148:   set_control_reg7201(csrptr,creg1|SLUTRANSIE,1); /* set int. bit */
                    149:   csrptr->cbuf = 0;            /* start output */
                    150:   _restore(&savesr);
                    151: }
                    152: 
                    153: 
                    154:   

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.