⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gp2test.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic	char sccsid[] = "@(#)gp2test.c 1.1 92/07/30 Copyright Sun Micro";#endif/* * Copyright (c) 1988 by Sun Microsystems, Inc. */#include <stdio.h>#include <errno.h>#include <signal.h>#include <sgtty.h>#include <ctype.h>#include <a.out.h>#include <strings.h>#include <sys/time.h>#include <sys/errno.h>#include <sys/types.h>#include <sys/param.h>#include <sys/ioctl.h>#include <sys/mman.h>#include <sys/fcntl.h>#include <sys/file.h>#include <suntool/gfx_hs.h>#include <sun/fbio.h>#include "gp2test.h"#include "gp2test_msgs.h"#include "sdrtns.h"			/* standard sundiag include */#include "../../../lib/include/libonline.h"	/* online library include */extern char *getenv();extern char *sprintf();extern void exception();int             iograb = FALSE;int      winfd, rootfd, devtopfd, errors;static unsigned char tred[256], tgrn[256], tblu[256];Pixrect         *screen;struct screen   new_screen;int    tmpplane;struct          sgttyb  ttybuf;short		orig_sg_flags;	/* original mode flags for stdin */int             origsigs, return_code;int		CgTWO = TRUE;static int      dummy(){return FALSE;}/* ************************************************************************* *	Sundiag GP2 test . * *	This test will perform hardware tests on the GP2 that are embeded *	in the microcode. It will test the floating point chip in the XP *	by performing GPCI commands that test matrix multiply, cliping, *	and point generation. Then it will test the complete GP2 hardware *	by having it display 5 sets of polygons on the screen. ************************************************************************* *//* ************************************************************************* *	Main * *	This function gets the options from sundiag calling routine and *	then calls the routines to setup the window enviroment and call *	each test to be executed. Then if passed cleanly will clean up *	the window enviroment to the same condition before the test  *	started. ************************************************************************* */main(argc, argv)    int argc;    char *argv[];{    int	arrcount;    versionid = "1.1";		/* SCCS version id */    device_name = "gpone0";    test_name = "gp2test";    test_init(argc, argv, dummy, dummy, (char *)NULL); /* *	Get Sundiag options */    verbose = 0;	/* gp2test verbose mode dees not work well*/    setup_signals();/* * probe for gp2 & cg5 boards. *	exit if none found. */    return_code = check_gp();    if (probe_cg() < CG_ONLY) {    /* did not find cg */        reset_signals();        exit(0);    }    run_tests();}/* ************************************************************************ *	run_tests. *	 *	This function calls the major test routines to be executed. *	and then reports back to the user if any errors are encountered *	in debug mode or when not being executed by Sundiag. ************************************************************************ */run_tests(){    unsigned int planes = GP2_BUFSIZ - 1;    setup_desktop();    init_static_blk();    pr_putattributes(screen, &planes);    test_hardware();    check_input();    test_mul_matrix();    check_input();    test_mul_point();    check_input();    test_proc_line();    check_input();    test_polygons();    check_input();    if (!CgTWO)         test_arbiter();    check_input();    if (verbose)        gp_send_message(0, VERBOSE, "GPCI Hardware Test.");    clean_up();    if (verbose)	gp_send_message(0, VERBOSE, stopped_msg);    exit(0);}/* **************************************************************************** *	setup_desktop(). * * If (single headed && window system ) we set up a new window. Otherwise  * we just do test on GP2. If we are running under window system, open up the  * suntools parent environment and get a new window, make 'suntools' the  * 'parent'. Set oldest child of new node to be the youngest child of parent. * Get screen size of suntools window and set the size of new window same size. * Put the new node into the tree. Let the "devtop" window catch the key  * strokes. Prevent any cursor from display, this must be done because the  * cursor could sneak into the display; remove the new window cursor. * Direct all inputs to new window and this cursor displayed over full screen. * The input mask would still be available if I had not NULLED it. * Remove the mouse. This is necessary because the mouse is still active over  * the other windows and clicking the mouse button will cause an interrupt. * I will fix it when exiting. Save the current gp2 state and enable all planes. **************************************************************************** */setup_desktop(){    Cursor cursor;    struct inputmask im;    char *winname, *perrmsg;    int planes;    int	mon_color, tmpfd;    struct	fbtype	fb_type;    struct	fbgattr	fb_gattr;      tmpfd=open("/dev/fb", O_RDWR);      ioctl(tmpfd, FBIOGTYPE, &fb_type);      if (( fb_type.fb_type == FBTYPE_SUN2GP ) && ( winname = getenv ("WINDOW_PARENT"))) {        if ((rootfd = open(winname, O_RDONLY)) <= 0) {	    perrmsg = errmsg(errno);	    if ( CgTWO ) 	       (void) sprintf(msg, rootfd_msg, CG_DEV, perrmsg);            else (void) sprintf(msg, rootfd_msg, CR_DEV, perrmsg);	    gp_send_message(SCREEN_NOT_OPEN, ERROR, msg);	    finish_it();	}        if ((winfd = win_getnewwindow()) < 0) {	    perrmsg = errmsg(errno);            if ( CgTWO )	       (void) sprintf(msg, winfd_msg, CG_DEV, perrmsg);            else (void) sprintf(msg, winfd_msg, CR_DEV, perrmsg);	    gp_send_message(SCREEN_NOT_OPEN, ERROR, msg);	    finish_it();	}        win_setlink(winfd, WL_PARENT,        	win_nametonumber(winname));        win_setlink(winfd, WL_OLDERSIB,        	win_getlink(rootfd, WL_YOUNGESTCHILD));        win_screenget(rootfd, &new_screen);        win_setrect(winfd, &new_screen.scr_rect);        input_imnull(&im);        im.im_flags |= IM_ASCII;        win_set_kbd_mask(winfd, &im);        win_insert(winfd);        cursor = cursor_create((char *)0);        win_getcursor(rootfd, cursor);        cursor_set(cursor, CURSOR_SHOW_CURSOR, 0, 0);        win_setcursor(rootfd, cursor);        cursor_copy(cursor);        cursor_destroy(cursor);	win_grabio(winfd);	win_remove_input_device(rootfd, new_screen.scr_msname);        iograb = TRUE;    }    opengp();    enable_vid();    pr_getattributes(screen, &tmpplane);    pr_getcolormap(screen, 0, 256, tred, tgrn, tblu);    planes = 0xff;    pr_putattributes(screen, &planes);    close ( tmpfd );}/* ************************************************************************** *	Remove the GP2 test window from the window system. **************************************************************************  */unlock_devtop(){    win_remove(winfd);}/* ************************************************************************* *	Enable CG5 video so that we can see the polygons being displayed *	on the color monitor. ************************************************************************** */enable_vid(){    int fd;    int vid;    char fbnamestr[80];    if (CgTWO) strcpy ( fbnamestr, CG_DEV ); else strcpy ( fbnamestr, CR_DEV );    vid = FBVIDEO_ON;    if ((fd = open(fbnamestr, O_RDWR)) != -1) {        (void) ioctl(fd, FBIOSVIDEO, &vid, 0);        (void) close(fd);    }}finish_it(){    clean_up();    exit(0);}/*  ************************************************************************** *	Restore CG5 color map. Reset the signals for the keyboard. *	Display the cursor in proper window. Then re-install the mouse. *	Remove the gp2 Test window. **************************************************************************\ */clean_up(){    Cursor  cursor;    int msfd;    int flag;    if (screen <= 0)        exit(0);    pr_putattributes(screen, &tmpplane);    pr_putcolormap(screen, 0, 256, tred, tgrn, tblu);    reset_signals();    if (iograb) {            cursor = cursor_create((char *)0);            win_getcursor(rootfd, cursor);            cursor_set(cursor, CURSOR_SHOW_CURSOR, 1, 0);            win_setcursor(rootfd, cursor);            cursor_destroy(cursor);             sleep(1);       /* for the heck of it */             flag = win_is_input_device(rootfd, "/dev/mouse");            if (flag == 1) {                if ((!exec_by_sundiag) || (debug))                    gp_send_message (0, DEBUG, 			"mouse was previously being utilized.\n");            } else if (flag == 0) {                if ((!exec_by_sundiag) || (debug))                    gp_send_message (0, DEBUG, "mouse was previously removed.\n");            } else if (flag == -1) {                if ((!exec_by_sundiag) || (debug))                    gp_send_message (0, DEBUG, "mouse error.\n");            }                        /* re-install the mouse */            msfd = open(new_screen.scr_msname);            if (msfd >= 0) {                win_set_input_device(rootfd, msfd, new_screen.scr_msname);                (void) close (msfd);            }            win_releaseio(winfd);        }    pr_destroy(screen);    (void) close(devtopfd);    (void) close(rootfd);    (void) close(winfd);}/*  ************************************************************************** * set up signals for non-blocking * input.  If this is not done, * the windows will have a queue of * input events to handle. ************************************************************************** */setup_signals(){    (void) ioctl(0, TIOCGETP, &ttybuf);    orig_sg_flags = ttybuf.sg_flags;/* save original mode flags from stdin */    ttybuf.sg_flags |= CBREAK;      /* non-block mode */    ttybuf.sg_flags &= ~ECHO;       /* no echo */    (void) ioctl(0, TIOCSETP, &ttybuf);    origsigs = sigsetmask(0);    (void) signal(SIGINT, finish_it);    (void) signal(SIGQUIT, finish_it);    (void) signal(SIGHUP, finish_it);    (void) signal(SIGXCPU, exception );}/*  ************************************************************************** *	Release the keyboard to accept all key strokes. *	set signals to the origianal signals. ************************************************************************** */reset_signals(){    if(!exec_by_sundiag)        (void) printf ("resetting signals...");    (void) ioctl(0, TIOCGETP, &ttybuf);    ttybuf.sg_flags = orig_sg_flags; /* restore orig mode flags for stdin */    (void) ioctl(0, TIOCSETP, &ttybuf);    /* set up original signals */    (void) sigsetmask(origsigs);    /* flush the buffer */    flush_io();    if(!exec_by_sundiag)        (void) printf ("done.\n");}/*  ************************************************************************** * 	Remove extra keystrokes that have been qued up. ************************************************************************** */flush_io(){    int tfd, arg, knt;    static char tmpbuf[CANBSIZ];     arg = 0;    if (devtopfd)        tfd = devtopfd;    else        tfd = 0;     (void) ioctl(tfd, FIONREAD, &arg);     knt = CANBSIZ;    while (arg > 0) {        if (arg < knt)            knt = arg;        knt = read (tfd, tmpbuf, knt);        arg -= knt;    }}/* * send_message the routine which logs messages to the logfile. * If (exec_by_sundiag == FALSE) then the message is sent to stderr * instead of to sundiag. There are 3 variables for  *	send_message: where, msg_type, * and msg. "where" can indicate a defined error number. The numbers 96-100 * are reserved by sundiag for bus errors in bus(), segmentation errors in * segv(), interrupts (<ctrl>c's) in finish(), command-line argument usage * errors (use USAGE_ERROR in your main(), see newtest.c), and RPC errors in * transmitting the message. If "where" is negative, the "send_message" * function will exit with the "where" exit code. * For "msg_type", use INFO, WARNING, FATAL, ERROR, or LOGFILE. * For msg, use a pointer (char *) to a message buffer which includes a \n. * The logfile message is formatted as follows: * (void) sprintf(fmt_msg, "%s:%s:%s:%s", device, test_name, msg_type_id, msg); * where device is set up by you (see process_newtest_args() in newtest.c), * test_name is argv[0], msg_type_id is the "msg_type"  * from send_message (INFO->I, * WARNING->W, ERROR->E, and LOGFILE->L), and msg is the msg from send_message. */gp_send_message(where, msg_type, msg)    int             where;    int             msg_type;    char           *msg;{    if ( iograb ) {        win_releaseio( devtopfd );        sleep(15);    }    send_message ( where, msg_type, msg );    if ( iograb ) {	win_grabio( devtopfd );	sleep(5);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -