Annotation of coherent/d/PS2_KERNEL/io.286/qq.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * qq - sample device driver using absolute memory addressing
                      3:  *
                      4:  * All this device does is read/write video ram.
                      5:  * It assumes that there is a monochrome adapter in use, so that video
                      6:  * ram starts at segment B000;  if color, this should be changed to B800.
                      7:  *
                      8:  * This driver does not do anything useful;  it is intended to serve as
                      9:  * an example.
                     10:  *
                     11:  * Here is how to make the driver and test it (you will need a COHERENT
                     12:  * Driver Kit installed on your system):
                     13:  * 1.  put this file, "qq.c", in /usr/src/sys/i8086/drv/qq.c
                     14:  * 2.  cut out the make file and store it in /usr/src/sys/i8086/drv/Mf.qq
                     15:  * 3.  cut out the config file and store it at /usr/sys/confdrv/qq
                     16:  * 4.  execute the following commands
                     17:  *             cd /usr/src/sys/i8086/drv
                     18:  *             make -f Mf.qq
                     19:  *             cd /usr/sys
                     20:  *             ldconfig qq
                     21:  *             drvld ldrv/qq
                     22:  * 5.  the driver should now be loaded - try "date > /dev/qq" or
                     23:  *     "cat < /dev/qq" (you will have to use Ctrl-C to stop the "cat"
                     24:  *     command)
                     25:  * 6.  to unload the driver, do "ps -d" to get the PID number for the driver;
                     26:  *     then do "kill kill nnn" where nnn is the process number for "<qq>"
                     27:  */
                     28: /****
                     29: Here is the makefile for the "qq" driver (cut it out of this file):
                     30: --------------- cut here -----------------
                     31: # Make file for a loadable driver
                     32: 
                     33: AS=exec /bin/as
                     34: CC=exec /bin/cc
                     35: CPP=exec /lib/cpp
                     36: CFLAGS=-I.. -I../sys -I../.. -I../../sys \
                     37:        -I/usr/include/sys
                     38: AFLAGS=-gx
                     39: 
                     40: # Include directories
                     41: USRINC=/usr/include
                     42: SYSINC=/usr/include/sys
                     43: KERINC=/usr/src/sys/sys
                     44: DRVINC=/usr/src/sys/i8086/sys
                     45: USRSYS=/usr/sys
                     46: 
                     47: DRVOBJ=        objects/qq.o
                     48: 
                     49: qq: objects/qq.o
                     50:        rm -f $(USRSYS)/lib/qq.a
                     51:        ar rc $(USRSYS)/lib/qq.a objects/qq.o
                     52: 
                     53: objects/qq.o:                          \
                     54:                $(KERINC)/coherent.h    $(SYSINC)/types.h \
                     55:                                        $(SYSINC)/machine.h $(SYSINC)/param.h \
                     56:                                        $(SYSINC)/fun.h \
                     57:                $(SYSINC)/con.h         \
                     58:                $(USRINC)/errno.h       \
                     59:                $(SYSINC)/sched.h       \
                     60:                $(SYSINC)/seg.h         \
                     61:                $(SYSINC)/stat.h        \
                     62:                $(SYSINC)/types.h       \
                     63:                qq.c
                     64:        $(CC) $(CFLAGS) -c -o $@ qq.c
                     65: --------------- cut here -----------------
                     66: 
                     67: Here is the configuration file for the "qq" driver.
                     68: Cut it out of this file and copy it to "/usr/sys/confdrv/qq".
                     69: When "ldconfig" is run, it will create a node for /dev/qq.
                     70: --------------- cut here -----------------
                     71: :
                     72: : 'Dummy driver for write to absolute RAM area'
                     73: :
                     74: UNDEF="${UNDEF} -u qqcon_ lib/qq.a"
                     75: PATCH="${PATCH} drvl_+70=qqcon_"
                     76: :
                     77: : devices
                     78: :
                     79: umask 0111
                     80: /etc/mknod -f ${DEV-/dev}/qq c 7  0 || exit 1
                     81: --------------- cut here -----------------
                     82: ****/
                     83: #include "coherent.h"
                     84: #include "ins8250.h"
                     85: #include <sys/stat.h>
                     86: #include <sys/uproc.h>
                     87: #include <sys/proc.h>
                     88: #include <sys/con.h>
                     89: #include <errno.h>
                     90: #include <sys/types.h>
                     91: #include <sys/mmu.h>
                     92: 
                     93: /*
                     94:  * Definitions.
                     95:  *
                     96:  */
                     97: #define        MONOVIDEO       0xB000          /* monochrome text RAM segment */
                     98: #define        VIDLENGTH       (2048*2)        /* screen locations (2 bytes each) */
                     99: 
                    100: /*
                    101:  * Export Functions.
                    102:  */
                    103: int    qqload();
                    104: int    qqopen();
                    105: int    qqclose();
                    106: int    qqread();
                    107: int    qqwrite();
                    108: int    qqunload();
                    109: 
                    110: /*
                    111:  * Import Functions
                    112:  */
                    113: int    nulldev();
                    114: int    nonedev();
                    115: 
                    116: /*
                    117:  * Configuration table.
                    118:  */
                    119: CON qqcon ={
                    120:        DFCHR,                          /* Flags */
                    121:        7,                              /* Major index */
                    122:        qqopen,                         /* Open */
                    123:        qqclose,                        /* Close */
                    124:        nulldev,                        /* Block */
                    125:        qqread,                         /* Read */
                    126:        qqwrite,                        /* Write */
                    127:        nulldev,                        /* Ioctl */
                    128:        nulldev,                        /* Powerfail */
                    129:        nulldev,                        /* Timeout */
                    130:        qqload,                         /* Load */
                    131:        qqunload,                       /* Unload */
                    132:        nulldev                         /* Poll */
                    133: };
                    134: 
                    135: /*
                    136:  * Local variables.
                    137:  */
                    138: static faddr_t screen_fp;              /* (far *) to access screen */
                    139: static paddr_t screen_base;            /* physical address of screen base */
                    140: 
                    141: /*
                    142:  * Load Routine.
                    143:  */
                    144: static qqload()
                    145: {
                    146:        /*
                    147:         * Allocate a selector to map onto the video RAM.  ptov() will
                    148:         * return the first available selector of the 8,192 possible.
                    149:         * This is time consuming, so we only want to do this as part
                    150:         * of our initialization code and not on every access.
                    151:         *
                    152:         * Since we are operating in 286 protected mode (ugh), the
                    153:         * second argument to ptov() must not exceed 0x10000L.
                    154:         */
                    155:        screen_base = (paddr_t)((long)(unsigned)MONOVIDEO << 4);
                    156:        screen_fp = ptov(screen_base, (fsize_t)VIDLENGTH);
                    157: }
                    158: 
                    159: static qqunload()
                    160: {
                    161:        /*
                    162:         * We have to free up the selector now that we're done using it.
                    163:         */
                    164:        vrelse(screen_fp);
                    165: }
                    166: 
                    167: /*
                    168:  * Open Routine.
                    169:  */
                    170: qqopen( dev, mode )
                    171: dev_t dev;
                    172: {
                    173: }
                    174: 
                    175: /*
                    176:  * Close Routine.
                    177:  */
                    178: qqclose( dev )
                    179: dev_t dev;
                    180: {
                    181: }
                    182: 
                    183: /*
                    184:  * Read Routine.
                    185:  */
                    186: qqread( dev, iop )
                    187: dev_t dev;
                    188: register IO * iop;
                    189: {
                    190:        static int offset;
                    191:        int c;
                    192:        /*
                    193:         * Read a character code from video RAM
                    194:         * Start reading RAM just after where previous read ended
                    195:         *
                    196:         * Note that "offset" is the value of the displacement into
                    197:         * the screen RAM. Any expression which results in a value
                    198:         * which is less than VIDLENGTH is OK here.
                    199:         */
                    200:        while(iop->io_ioc) {
                    201:                c = ffbyte(screen_fp + offset); /* fetch a "far" byte */
                    202:                if(ioputc(c, iop) == -1)
                    203:                        break;
                    204:                offset += 2;
                    205:                offset %= VIDLENGTH;
                    206:        }
                    207: }
                    208: 
                    209: /*
                    210:  * Write Routine.
                    211:  */
                    212: qqwrite( dev, iop )
                    213: dev_t dev;
                    214: register IO * iop;
                    215: {
                    216:        int offset = 0;
                    217:        int c;
                    218: 
                    219:        /*
                    220:         * Write a character into the screen RAM
                    221:         * Note that "offset" is the value of the displacement into
                    222:         * the screen RAM. Any expression which results in a value
                    223:         * which is less than VIDLENGTH is OK here.
                    224:         */
                    225:        while ((c = iogetc(iop)) >= 0 && offset < VIDLENGTH) {
                    226:                sfbyte(screen_fp + offset, c);     /* store a "far" byte */
                    227:                offset += 2;    /* skip attribute byte */
                    228:        }
                    229: }

unix.superglobalmegacorp.com

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