1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15:
16: 17: 18: 19:
20: #include "kbpd.h"
21: #include <device/devconf.h>
22:
23:
24: IMPORT W GetDevConf( UB *name, W *val );
25:
26: EXPORT ID CmdTsk;
27: EXPORT ID CmdFlg;
28: EXPORT ID EvtMbx;
29: EXPORT ID InpMbf;
30:
31: EXPORT BOOL Suspended;
32:
33: EXPORT UW InpMode;
34: EXPORT UW KbdId;
35: EXPORT W PdSense;
36:
37: EXPORT PRI TaskPri;
38:
39: #define devkbpd "kbpd"
40:
41: 42: 43:
44: EXPORT INT kpCreTask(W name, FP entry)
45: {
46: T_CTSK ctsk;
47: ID tskid;
48: INT er;
49:
50:
51: ctsk.exinf = (void*)name;
52: ctsk.task = entry;
53: ctsk.itskpri = TaskPri;
54: ctsk.stksz = TASK_STKSZ;
55: ctsk.tskatr = TA_HLNG | TA_RNG0;
56:
57: tskid = er = tk_cre_tsk(&ctsk);
58: if (er >= E_OK) {
59: er = tk_sta_tsk(tskid, 0);
60: if (er < E_OK) tk_del_tsk(tskid);
61: }
62: return (er >= E_OK) ? tskid : er;
63: }
64: 65: 66:
67: LOCAL ER kpStartUp(void)
68: {
69: W w[L_DEVCONF_VAL];
70: W dd, n;
71: ER er;
72: RawEvt evt;
73: T_CMBF cmbf;
74: T_CFLG cflg;
75: ID datatsk;
76: void* name;
77: union {
78: FlgInStat stat;
79: UW uw;
80: } u;
81:
82:
83: dd = er = tk_opn_dev(devkbpd, TD_READ);
84: if (er >= E_OK) {
85: er = tk_srea_dev(dd, DN_KPINPUT, (VB*)&EvtMbx,
86: sizeof(EvtMbx), &n);
87: tk_cls_dev(dd, 0);
88: }
89: if (er < E_OK) goto EEXIT1;
90:
91:
92: KbdId = (GetDevConf("KBTYPE", w) == 1) ? w[0] : KID_IBM_JP;
93:
94:
95: SetOBJNAME(cmbf.exinf, "lkbM");
96: cmbf.mbfatr = TA_TFIFO;
97: cmbf.bufsz = sizeof(InMsg) * MAX_INMSG;
98: cmbf.maxmsz = sizeof(InMsg);
99: if ((er = tk_cre_mbf(&cmbf)) < E_OK) goto EEXIT1;
100: InpMbf = er;
101:
102:
103: SetOBJNAME(cflg.exinf, "lkbC");
104: cflg.flgatr = TA_WMUL;
105: cflg.iflgptn = 0;
106: if ((er = tk_cre_flg(&cflg)) < E_OK) goto EEXIT2;
107: CmdFlg = (ID)er;
108:
109:
110: SetOBJNAME(name, "lkbD");
111: er = kpCreTask((W)name, kpDataTask);
112: if (er < E_OK) goto EEXIT3;
113: datatsk = (ID)er;
114:
115:
116: SetOBJNAME(name, "lkbC");
117: er = kpCreTask((W)name, kpCmdTask);
118: if (er < E_OK) goto EEXIT4;
119: CmdTsk = (ID)er;
120:
121:
122: u.uw = 0;
123: evt.f.stat = u.stat;
124: evt.f.stat.cmd = INP_FLG;
125: evt.f.stat.kb = 1;
126: evt.f.stat.kbid = KbdId;
127: evt.f.stat.reg = 1;
128: evt.f.flgid = CmdFlg;
129: if ((er = kpSendMsg(&evt)) < E_OK) goto EEXIT5;
130:
131:
132: er = hwInit(DC_OPEN);
133: if (er < E_OK) goto EEXIT5;
134:
135: return E_OK;
136:
137: EEXIT5:
138: tk_ter_tsk(CmdTsk);
139: tk_del_tsk(CmdTsk);
140: EEXIT4:
141: tk_ter_tsk(datatsk);
142: tk_del_tsk(datatsk);
143: EEXIT3:
144: tk_del_flg(CmdFlg);
145: EEXIT2:
146: tk_del_mbf(InpMbf);
147: EEXIT1:
148: DP(("kpStartUp: err=%#x\n", er));
149: return er;
150: }
151: 152: 153:
154: EXPORT ER LowKbPdDrv(INT ac, UB *av[])
155: {
156: char *arg;
157: W v[L_DEVCONF_VAL];
158:
159:
160: if (GetDevConf("LowKbPdDrvEnable", v) > 0 && !v[0]) return E_NOSPT;
161:
162: if (ac < 0) return E_OK;
163:
164:
165: TaskPri = DEF_PRIORITY;
166: if (ac > 1 && (arg = av[1]) != NULL) {
167: switch (*arg++) {
168: case '!':
169: TaskPri = STRTOUL(arg, &arg, 0);
170: break;
171: default:
172: return E_PAR;
173: }
174: }
175:
176:
177: return kpStartUp();
178: }