/* KBPD keyboard/ PD real I/O driver entry */ EXPORT ER LowKbPdDrv(INT ac, UB *av[]) { char *arg; W v[L_DEVCONF_VAL]; /* effective? */ if (GetDevConf("LowKbPdDrvEnable", v) > 0 && !v[0]) return E_NOSPT; if (ac < 0) return E_OK; /* no special epilog processor event */ /* obtain start parameter */ TaskPri = DEF_PRIORITY; if (ac > 1 && (arg = av[1]) != NULL) { switch (*arg++) { case '!': /* priority */ TaskPri = STRTOUL(arg, &arg, 0); break; default: return E_PAR; } } /* driver initialization */ return kpStartUp(); }
/* * Initialization at ROM startup * This function is called before 'main()'. * (same as 'SBOOT' for disk boot) */ EXPORT ER ROM_startup( void ) { W val[L_DEVCONF_VAL]; W n; /* Set SYSCONF/DEVCONF */ SCInfo.sysconf = ROMInfo->sysconf; SCInfo.devconf = ROMInfo->devconf; /* Initialize Boot mode/Operation mode */ SCInfo.bm.w = 0; /* Set debug mode */ n = GetDevConf(DCTAG_DEBUGMODE, val); SCInfo.bm.c.debug = ( n >= 1 && val[0] > 0 )? 1: 0; /* Set boot device (no boot device) */ SCInfo.bootdev[0] = '\0'; return E_OK; }
/* startup */ EXPORT ER ScreenDrv(INT ac, UB *av[]) { ER er; T_IDEV idev; SDefDev ddev = { NULL, /* exinf */ "SCREEN", /* devnm */ 0, /* drvatr */ 0, /* devatr */ 0, /* nsub */ 1, /* blksz */ NULL, /* open */ NULL, /* close */ readfn, /* read */ writefn, /* write */ eventfn, /* event */ }; W v[L_DEVCONF_VAL]; /* effective? */ if (GetDevConf("ScreenDrvEnable", v) > 0 && !v[0]) return E_NOSPT; /* epilog processing */ if (ac < 0) { if (Vinf.attr & NEED_FINPROC) (*(Vinf.fn_setmode))(-1); return E_OK; } /* initialization */ suspended = FALSE; /* device initialization processing */ if ((er = initSCREEN()) < E_OK) goto EEXIT; /* register device */ er = SDefDevice(&ddev, &idev, &ScrSdi); if (er < E_OK) finishSCREEN(); EEXIT: return er; }
/* initial setting at driver start up time */ LOCAL ER kpStartUp(void) { W w[L_DEVCONF_VAL]; W dd, n; ER er; RawEvt evt; T_CMBF cmbf; T_CFLG cflg; ID datatsk; void* name; union { FlgInStat stat; UW uw; } u; /* extract ID of the mailbox for event notification to KB/PD driver */ dd = er = tk_opn_dev(devkbpd, TD_READ); if (er >= E_OK) { er = tk_srea_dev(dd, DN_KPINPUT, (VB*)&EvtMbx, sizeof(EvtMbx), &n); tk_cls_dev(dd, 0); } if (er < E_OK) goto EEXIT1; /* KBID is extracted from DEVCONF parameter */ KbdId = (GetDevConf("KBTYPE", w) == 1) ? w[0] : KID_IBM_JP; /* input message buffer creation */ SetOBJNAME(cmbf.exinf, "lkbM"); cmbf.mbfatr = TA_TFIFO; cmbf.bufsz = sizeof(InMsg) * MAX_INMSG; cmbf.maxmsz = sizeof(InMsg); if ((er = tk_cre_mbf(&cmbf)) < E_OK) goto EEXIT1; InpMbf = er; /* creating the event flag for command */ SetOBJNAME(cflg.exinf, "lkbC"); cflg.flgatr = TA_WMUL; cflg.iflgptn = 0; if ((er = tk_cre_flg(&cflg)) < E_OK) goto EEXIT2; CmdFlg = (ID)er; /* create and start data processing task */ SetOBJNAME(name, "lkbD"); er = kpCreTask((W)name, kpDataTask); if (er < E_OK) goto EEXIT3; datatsk = (ID)er; /* create and start command processing task */ SetOBJNAME(name, "lkbC"); er = kpCreTask((W)name, kpCmdTask); if (er < E_OK) goto EEXIT4; CmdTsk = (ID)er; /* registering event flag for commands */ u.uw = 0; evt.f.stat = u.stat; evt.f.stat.cmd = INP_FLG; evt.f.stat.kb = 1; evt.f.stat.kbid = KbdId; evt.f.stat.reg = 1; evt.f.flgid = CmdFlg; if ((er = kpSendMsg(&evt)) < E_OK) goto EEXIT5; /* device initialization processing */ er = hwInit(DC_OPEN); if (er < E_OK) goto EEXIT5; return E_OK; EEXIT5: tk_ter_tsk(CmdTsk); tk_del_tsk(CmdTsk); EEXIT4: tk_ter_tsk(datatsk); tk_del_tsk(datatsk); EEXIT3: tk_del_flg(CmdFlg); EEXIT2: tk_del_mbf(InpMbf); EEXIT1: DP(("kpStartUp: err=%#x\n", er)); return er; }