Annotation of Gnu-Mach/chips/mouse.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1992-1989 Carnegie Mellon University
        !             4:  * All Rights Reserved.
        !             5:  * 
        !             6:  * Permission to use, copy, modify and distribute this software and its
        !             7:  * documentation is hereby granted, provided that both the copyright
        !             8:  * notice and this permission notice appear in all copies of the
        !             9:  * software, derivative works or modified versions, and any portions
        !            10:  * thereof, and that both notices appear in supporting documentation.
        !            11:  * 
        !            12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            15:  * 
        !            16:  * Carnegie Mellon requests users of this software to return to
        !            17:  * 
        !            18:  *  Software Distribution Coordinator  or  [email protected]
        !            19:  *  School of Computer Science
        !            20:  *  Carnegie Mellon University
        !            21:  *  Pittsburgh PA 15213-3890
        !            22:  * 
        !            23:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            24:  * the rights to redistribute these changes.
        !            25:  */
        !            26: /*
        !            27:  *     File: mouse.c
        !            28:  *     Author: Alessandro Forin, Carnegie Mellon University
        !            29:  *     Date:   9/90
        !            30:  *
        !            31:  *     Driver code for Digital's mouse AND tablet
        !            32:  */
        !            33: 
        !            34: /*
        !            35:  * XXX This should be rewritten to support other
        !            36:  * XXX sorts of mices and tablets.  But for now
        !            37:  * XXX I have none to play with. Sorry about that.
        !            38:  */
        !            39: 
        !            40: #include <lk.h>                        /* one mouse per lk201 */
        !            41: #if    NLK > 0
        !            42: 
        !            43: #include <mach/std_types.h>
        !            44: #include <machine/machspl.h>           /* spl definitions */
        !            45: #include <sys/time.h>
        !            46: #include <kern/time_out.h>
        !            47: 
        !            48: #include <chips/serial_defs.h>
        !            49: #include <chips/screen_defs.h>
        !            50: 
        !            51: #define        MOUSE_INCREMENTAL       0x52    /* R */
        !            52: #define        MOUSE_PROMPTED          0x44    /* D */
        !            53: #define        MOUSE_REQ_POSITION      0x50    /* P */
        !            54: #define        MOUSE_SELFTEST          0x54    /* T */
        !            55: #define MOUSE_RESERVED_FUNC    0x5a    /* Z, param byte follows */
        !            56: 
        !            57: #define TABLET_SAMPLE_55       0x4b    /* K */ /* in reps/sec */
        !            58: #define TABLET_SAMPLE_72       0x4c    /* L */
        !            59: #define TABLET_SAMPLE_120      0x4d    /* M */
        !            60: #define TABLET_9600            0x42    /* B */
        !            61: 
        !            62: #define        TYPE_MOUSE              0x2
        !            63: #define        TYPE_TABLET             0x4
        !            64: 
        !            65: #define        START_REPORT            0x80
        !            66: 
        !            67: typedef union {
        !            68:        struct {
        !            69:                unsigned char   r : 1, m : 1, l : 1, sy : 1, sx : 1;
        !            70:                unsigned char   xpos;
        !            71:                unsigned char   ypos;
        !            72:        } ms;
        !            73:        struct {
        !            74:                unsigned char   pr : 1, buttons : 4;
        !            75:                unsigned char   xlo, xhi;
        !            76:                unsigned char   ylo, yhi;
        !            77:        } tb;
        !            78:        unsigned char raw[1];
        !            79: } mouse_report_t;
        !            80: 
        !            81: 
        !            82: /*
        !            83:  *     Mouse state
        !            84:  */
        !            85: struct mouse_softc {
        !            86:        user_info_t     *up;
        !            87:        mouse_report_t  report;
        !            88:        unsigned char   rep_bytes;
        !            89:        unsigned char   rep_ptr;
        !            90:        unsigned char   prev_buttons;
        !            91:        unsigned char   flags;
        !            92: #define        MS_TABLET       0x1
        !            93: #define        MS_MOVING       0x2
        !            94:        char            screen_unit;
        !            95:        char            sl_unit;
        !            96: } mouse_softc_data[NLK];
        !            97: 
        !            98: typedef struct mouse_softc     *mouse_softc_t;
        !            99: 
        !           100: mouse_softc_t  mouse_softc[NLK];
        !           101: 
        !           102: 
        !           103: mouse_notify_mapped(
        !           104:        int             unit,
        !           105:        int             screen_unit,
        !           106:        user_info_t     *up)
        !           107: {
        !           108:        mouse_softc_t   ms = &mouse_softc_data[unit];
        !           109: 
        !           110:        ms->up = up;
        !           111:        ms->screen_unit = screen_unit;
        !           112: }
        !           113: 
        !           114: /*
        !           115:  *     Autoconfiguration
        !           116:  */
        !           117: mouse_probe(
        !           118:        int     unit)
        !           119: {
        !           120:        mouse_softc[unit] = &mouse_softc_data[unit];
        !           121: }
        !           122: 
        !           123: mouse_attach(
        !           124:        int             unit,
        !           125:        int             sl_unit)
        !           126: {
        !           127:        int             messg[4];
        !           128:        spl_t           s;
        !           129:        mouse_softc_t   ms;
        !           130: 
        !           131:        ms = mouse_softc[unit];
        !           132:        ms->sl_unit = sl_unit;
        !           133: 
        !           134:        s = spltty();
        !           135:        (*console_putc)(sl_unit, SCREEN_LINE_POINTER, MOUSE_SELFTEST);
        !           136:        delay(1);
        !           137:        messg[0] = (*console_getc)(sl_unit, SCREEN_LINE_POINTER, TRUE, TRUE);
        !           138:        messg[1] = (*console_getc)(sl_unit, SCREEN_LINE_POINTER, TRUE, TRUE);
        !           139:        messg[2] = (*console_getc)(sl_unit, SCREEN_LINE_POINTER, TRUE, TRUE);
        !           140:        messg[3] = (*console_getc)(sl_unit, SCREEN_LINE_POINTER, TRUE, TRUE);
        !           141: 
        !           142:        delay(100000);  /* spec says less than 500 msecs */
        !           143:        (*console_putc)(sl_unit, SCREEN_LINE_POINTER, MOUSE_INCREMENTAL);
        !           144:        splx(s);
        !           145: 
        !           146:        ms->rep_bytes = 3;/* mouse */
        !           147:        if (messg[2] | messg[3]) {
        !           148:                printf(" bad pointer [%x %x %x %x] ",
        !           149:                        messg[0], messg[1], messg[2], messg[3]);
        !           150:                if (messg[2] >= 0x20) printf("fatal ");
        !           151:                if (messg[2] == 0x3e) printf("RAM/ROM");
        !           152:                if (messg[2] == 0x3d) printf("button(s) %x", messg[3] & 0x1f);
        !           153:        } else {
        !           154:                int rev = messg[0] & 0xf;
        !           155:                int loc = (messg[1] & 0xf0) >> 4;
        !           156:                int tag = (messg[1] & 0xf);
        !           157:                printf("( %s rev. %x.%x )",
        !           158:                        (tag == TYPE_MOUSE) ? "mouse" : "tablet",
        !           159:                        rev, loc);
        !           160:                if (tag == TYPE_TABLET) {
        !           161:                        ms->flags = MS_TABLET;
        !           162:                        ms->rep_bytes = 5;
        !           163:                }
        !           164:        }
        !           165: }
        !           166: 
        !           167: /*
        !           168:  *     Process a character from the mouse
        !           169:  */
        !           170: mouse_input(
        !           171:        int     unit,
        !           172:        register unsigned short data)
        !           173: {
        !           174:        mouse_softc_t   ms = mouse_softc[unit];
        !           175:        register char   flg, but;
        !           176: 
        !           177:        data &= 0xff;
        !           178: 
        !           179:        /* sanity: might miss a byte sometimes */
        !           180:        if (data & START_REPORT)
        !           181:                ms->rep_ptr = 0;
        !           182: 
        !           183:        /* add byte to report */
        !           184:        ms->report.raw[ms->rep_ptr++] = data;
        !           185: 
        !           186:        /* does this mean the mouse is moving */
        !           187:        if (data && ((data & START_REPORT) == 0))
        !           188:                ms->flags |= MS_MOVING;
        !           189: 
        !           190:        /* Report complete ? */
        !           191:        if (ms->rep_ptr != ms->rep_bytes)
        !           192:                return;
        !           193:        ms->rep_ptr = 0;
        !           194: 
        !           195:        ssaver_bump(ms->screen_unit);
        !           196: 
        !           197:        /* check for mouse moved */
        !           198:        flg = ms->flags;
        !           199:        if (flg & MS_MOVING) {
        !           200:                ms->flags = flg & ~MS_MOVING;
        !           201:                mouse_motion_event(ms, flg);
        !           202:        }
        !           203: 
        !           204:        /* check for button pressed */
        !           205:        if (but = ms->prev_buttons ^ ms->report.raw[0]) {
        !           206:                mouse_button_event(ms, flg, but);
        !           207:                ms->prev_buttons = ms->report.raw[0];
        !           208:        }
        !           209: }
        !           210: 
        !           211: /*
        !           212:  * The mouse/puck moved.
        !           213:  * Find how much and post an event
        !           214:  */
        !           215: mouse_motion_event(
        !           216:        mouse_softc_t   ms,
        !           217:        int             flg)
        !           218: {
        !           219:        register int            x, y;
        !           220: 
        !           221:        if (flg & MS_TABLET) {
        !           222: 
        !           223:                flg = DEV_TABLET;
        !           224: 
        !           225:                x = (ms->report.tb.xhi << 8) | ms->report.tb.xlo;
        !           226:                y = (ms->report.tb.yhi << 8) | ms->report.tb.ylo;
        !           227: 
        !           228:        } else {
        !           229: 
        !           230:                flg = DEV_MOUSE;
        !           231: 
        !           232:                x = ms->report.ms.xpos;
        !           233:                if (!ms->report.ms.sx)  /* ??? */
        !           234:                        x = -x;
        !           235: 
        !           236:                y = ms->report.ms.ypos;
        !           237:                if (ms->report.ms.sy)
        !           238:                        y = -y;
        !           239: 
        !           240:        }
        !           241: 
        !           242:        screen_motion_event(ms->screen_unit, flg, x, y);
        !           243: }
        !           244: 
        !           245: /*
        !           246:  * A mouse/puck button was pressed/released.
        !           247:  * Find which one and post an event
        !           248:  */
        !           249: mouse_button_event(
        !           250:        mouse_softc_t   ms,
        !           251:        int             flg,
        !           252:        int             bmask)
        !           253: {
        !           254:        register unsigned int   buttons, i;
        !           255:        int                     key, type;
        !           256: 
        !           257:        buttons = ms->report.raw[0];
        !           258:        if (flg & MS_TABLET) {
        !           259:                /* check each one of the four buttons */
        !           260:                for (i = 0; i < 4; i += 1) {
        !           261:                        if ((bmask & (2<<i)) == 0)
        !           262:                                continue;/* did not change */
        !           263:                        type = (buttons & (2<<i)) ? EVT_BUTTON_DOWN : EVT_BUTTON_UP;
        !           264:                        key = i;
        !           265: 
        !           266:                        screen_keypress_event(  ms->screen_unit,
        !           267:                                                DEV_TABLET, key, type);
        !           268:                }
        !           269:        } else {
        !           270:                ms->up->mouse_buttons = buttons & 0x7;
        !           271:                /* check each one of the three buttons */
        !           272:                for (i = 0; i < 3; i += 1) {
        !           273:                        if ((bmask & (1<<i)) == 0)
        !           274:                                continue;/* did not change */
        !           275:                        type = (buttons & (1<<i)) ? EVT_BUTTON_DOWN : EVT_BUTTON_UP;
        !           276: 
        !           277:                        if (i & 1)
        !           278:                                key = KEY_MIDDLE_BUTTON;
        !           279:                        else if ((i & 2) == 0)
        !           280:                                key = KEY_RIGHT_BUTTON;
        !           281:                        else
        !           282:                                key = KEY_LEFT_BUTTON;
        !           283: 
        !           284:                        screen_keypress_event(  ms->screen_unit,
        !           285:                                                DEV_MOUSE, key, type);
        !           286:                }
        !           287:        }
        !           288: }
        !           289: 
        !           290: /*
        !           291:  * Generate escape sequences for position reporting
        !           292:  * These are the same as xterm's.
        !           293:  * Prefix:
        !           294:  *     ESC [ M         button down
        !           295:  *     ESC [ N         button up
        !           296:  * Body:
        !           297:  *     BUTTON COL ROW
        !           298:  * Button:
        !           299:  *     0 <-> left, 1 <-> middle, 2 <-> right
        !           300:  * All body values are offset by the ascii SPACE character
        !           301:  */
        !           302: #define ESC    '\033'
        !           303: #define        SPACE   ' '
        !           304: 
        !           305: mouse_report_position(
        !           306:        int     unit,
        !           307:        int     col,
        !           308:        int     row,
        !           309:        int     key,
        !           310:        int     type)
        !           311: {
        !           312:        cons_input(SCREEN_LINE_KEYBOARD, ESC, 0);
        !           313:        cons_input(SCREEN_LINE_KEYBOARD, '[', 0);
        !           314:        cons_input(SCREEN_LINE_KEYBOARD, (type==EVT_BUTTON_DOWN) ? 'M':'N', 0);
        !           315:        
        !           316:        cons_input(SCREEN_LINE_KEYBOARD, (key - 1) + SPACE, 0);/* quick remapping */
        !           317:        cons_input(SCREEN_LINE_KEYBOARD, SPACE + col + 2, 0);
        !           318:        cons_input(SCREEN_LINE_KEYBOARD, SPACE + row + 1, 0);
        !           319: }
        !           320: 
        !           321: #endif NLK > 0

unix.superglobalmegacorp.com

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