|
@@ -36,6 +36,7 @@ struct KDev
|
|
|
Channel*repeatc; /* only for keyboard */
|
|
|
int accel; /* only for mouse */
|
|
|
int bootp; /* has associated keyboard */
|
|
|
+ int debug;
|
|
|
HidRepTempl templ;
|
|
|
int (*ptrvals)(KDev *kd, Chain *ch, int *px, int *py, int *pb);
|
|
|
};
|
|
@@ -118,8 +119,6 @@ static Kin ptrin =
|
|
|
.fd = -1,
|
|
|
};
|
|
|
|
|
|
-static int kbdebug;
|
|
|
-
|
|
|
static int ptrbootpvals(KDev *kd, Chain *ch, int *px, int *py, int *pb);
|
|
|
static int ptrrepvals(KDev *kd, Chain *ch, int *px, int *py, int *pb);
|
|
|
|
|
@@ -153,7 +152,7 @@ setfirstconfig(KDev* f, int eid, uchar *desc, int descsz)
|
|
|
}
|
|
|
id = f->dev->usb->ep[eid]->iface->id;
|
|
|
r = Rh2d | Rstd | Rdev;
|
|
|
- nr =usbcmd(f->dev, r, Rsetconf, 1, id, nil, 0);
|
|
|
+ nr = usbcmd(f->dev, r, Rsetconf, 1, 0, nil, 0);
|
|
|
if(nr < 0)
|
|
|
return -1;
|
|
|
r = Rh2d | Rclass | Riface;
|
|
@@ -162,9 +161,9 @@ setfirstconfig(KDev* f, int eid, uchar *desc, int descsz)
|
|
|
return -1;
|
|
|
r = Rd2h | Rstd | Riface;
|
|
|
nr=usbcmd(f->dev, r, Rgetdesc, Dreport<<8, id, desc, descsz);
|
|
|
- if(nr < 0)
|
|
|
+ if(nr <= 0)
|
|
|
return -1;
|
|
|
- if(kbdebug && nr > 0){
|
|
|
+ if(f->debug){
|
|
|
fprint(2, "report descriptor:");
|
|
|
for(i = 0; i < nr; i++){
|
|
|
if(i%8 == 0)
|
|
@@ -290,7 +289,7 @@ ptrrepvals(KDev *kd, Chain *ch, int *px, int *py, int *pb)
|
|
|
return -1;
|
|
|
parsereport(&kd->templ, ch);
|
|
|
|
|
|
- if(kbdebug)
|
|
|
+ if(kd->debug > 1)
|
|
|
dumpreport(&kd->templ);
|
|
|
if(c < 3)
|
|
|
return -1;
|
|
@@ -378,7 +377,7 @@ ptrwork(void* a)
|
|
|
x = scale(f, x);
|
|
|
y = scale(f, y);
|
|
|
}
|
|
|
- if(kbdebug > 1)
|
|
|
+ if(f->debug > 1)
|
|
|
fprint(2, "kb: m%11d %11d %11d\n", x, y, b);
|
|
|
seprint(mbuf, mbuf+sizeof(mbuf), "m%11d %11d %11d", x, y,b);
|
|
|
if(write(mfd, mbuf, strlen(mbuf)) < 0)
|
|
@@ -409,19 +408,21 @@ startrepeat(KDev *f, uchar esc1, uchar sc)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-putscan(int kbinfd, uchar esc, uchar sc)
|
|
|
+putscan(KDev *f, uchar esc, uchar sc)
|
|
|
{
|
|
|
+ int kbinfd;
|
|
|
uchar s[2] = {SCesc1, 0};
|
|
|
|
|
|
+ kbinfd = f->in->fd;
|
|
|
if(sc == 0x41){
|
|
|
- kbdebug += 2;
|
|
|
+ f->debug += 2;
|
|
|
return;
|
|
|
}
|
|
|
if(sc == 0x42){
|
|
|
- kbdebug = 0;
|
|
|
+ f->debug = 0;
|
|
|
return;
|
|
|
}
|
|
|
- if(kbdebug)
|
|
|
+ if(f->debug > 1)
|
|
|
fprint(2, "sc: %x %x\n", (esc? SCesc1: 0), sc);
|
|
|
s[1] = sc;
|
|
|
if(esc && sc != 0)
|
|
@@ -435,7 +436,6 @@ repeatproc(void* a)
|
|
|
{
|
|
|
KDev *f;
|
|
|
Channel *repeatc;
|
|
|
- int kbdinfd;
|
|
|
ulong l, t, i;
|
|
|
uchar esc1, sc;
|
|
|
|
|
@@ -446,7 +446,6 @@ repeatproc(void* a)
|
|
|
*/
|
|
|
f = a;
|
|
|
repeatc = f->repeatc;
|
|
|
- kbdinfd = f->in->fd;
|
|
|
l = Awakemsg;
|
|
|
Repeat:
|
|
|
if(l == Diemsg)
|
|
@@ -464,7 +463,7 @@ Repeat:
|
|
|
goto Repeat;
|
|
|
sleep(5);
|
|
|
}
|
|
|
- putscan(kbdinfd, esc1, sc);
|
|
|
+ putscan(f, esc1, sc);
|
|
|
t = 30;
|
|
|
}
|
|
|
Abort:
|
|
@@ -477,13 +476,13 @@ Abort:
|
|
|
#define hasesc1(sc) (((sc) > 0x47) || ((sc) == 0x38))
|
|
|
|
|
|
static void
|
|
|
-putmod(int fd, uchar mods, uchar omods, uchar mask, uchar esc, uchar sc)
|
|
|
+putmod(KDev *f, uchar mods, uchar omods, uchar mask, uchar esc, uchar sc)
|
|
|
{
|
|
|
/* BUG: Should be a single write */
|
|
|
if((mods&mask) && !(omods&mask))
|
|
|
- putscan(fd, esc, sc);
|
|
|
+ putscan(f, esc, sc);
|
|
|
if(!(mods&mask) && (omods&mask))
|
|
|
- putscan(fd, esc, Keyup|sc);
|
|
|
+ putscan(f, esc, Keyup|sc);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -499,14 +498,12 @@ putkeys(KDev *f, uchar buf[], uchar obuf[], int n, uchar dk)
|
|
|
{
|
|
|
int i, j;
|
|
|
uchar uk;
|
|
|
- int fd;
|
|
|
|
|
|
- fd = f->in->fd;
|
|
|
- putmod(fd, buf[0], obuf[0], Mctrl, 0, SCctrl);
|
|
|
- putmod(fd, buf[0], obuf[0], (1<<Mlshift), 0, SClshift);
|
|
|
- putmod(fd, buf[0], obuf[0], (1<<Mrshift), 0, SCrshift);
|
|
|
- putmod(fd, buf[0], obuf[0], Mcompose, 0, SCcompose);
|
|
|
- putmod(fd, buf[0], obuf[0], Maltgr, 1, SCcompose);
|
|
|
+ putmod(f, buf[0], obuf[0], Mctrl, 0, SCctrl);
|
|
|
+ putmod(f, buf[0], obuf[0], (1<<Mlshift), 0, SClshift);
|
|
|
+ putmod(f, buf[0], obuf[0], (1<<Mrshift), 0, SCrshift);
|
|
|
+ putmod(f, buf[0], obuf[0], Mcompose, 0, SCcompose);
|
|
|
+ putmod(f, buf[0], obuf[0], Maltgr, 1, SCcompose);
|
|
|
|
|
|
/* Report key downs */
|
|
|
for(i = 2; i < n; i++){
|
|
@@ -515,7 +512,7 @@ putkeys(KDev *f, uchar buf[], uchar obuf[], int n, uchar dk)
|
|
|
break;
|
|
|
if(j == n && buf[i] != 0){
|
|
|
dk = sctab[buf[i]];
|
|
|
- putscan(fd, hasesc1(dk), dk);
|
|
|
+ putscan(f, hasesc1(dk), dk);
|
|
|
startrepeat(f, hasesc1(dk), dk);
|
|
|
}
|
|
|
}
|
|
@@ -528,7 +525,7 @@ putkeys(KDev *f, uchar buf[], uchar obuf[], int n, uchar dk)
|
|
|
break;
|
|
|
if(j == n && obuf[i] != 0){
|
|
|
uk = sctab[obuf[i]];
|
|
|
- putscan(fd, hasesc1(uk), uk|Keyup);
|
|
|
+ putscan(f, hasesc1(uk), uk|Keyup);
|
|
|
}
|
|
|
}
|
|
|
if(uk && (dk == 0 || dk == uk)){
|
|
@@ -589,7 +586,7 @@ kbdwork(void *a)
|
|
|
continue;
|
|
|
if(kbdbusy(buf + 2, c - 2))
|
|
|
continue;
|
|
|
- if(usbdebug > 2 || kbdebug > 1){
|
|
|
+ if(usbdebug > 2 || f->debug > 1){
|
|
|
fprint(2, "kbd mod %x: ", buf[0]);
|
|
|
for(i = 2; i < c; i++)
|
|
|
fprint(2, "kc %x ", buf[i]);
|
|
@@ -669,7 +666,7 @@ kbstart(Dev *d, Ep *ep, Kin *in, void (*f)(void*), KDev *kd)
|
|
|
fprint(2, "kb: %s: bootproto: %r\n", d->dir);
|
|
|
return;
|
|
|
}
|
|
|
- }else if(kbdebug)
|
|
|
+ }else if(kd->debug)
|
|
|
dumpreport(&kd->templ);
|
|
|
if(opendevdata(kd->ep, OREAD) < 0){
|
|
|
fprint(2, "kb: %s: opendevdata: %r\n", kd->ep->dir);
|
|
@@ -692,7 +689,7 @@ usage(void)
|
|
|
int
|
|
|
kbmain(Dev *d, int argc, char* argv[])
|
|
|
{
|
|
|
- int bootp, i, kena, pena, accel, devid;
|
|
|
+ int bootp, i, kena, pena, accel, devid, debug;
|
|
|
Ep *ep;
|
|
|
KDev *kd;
|
|
|
Usbdev *ud;
|
|
@@ -700,13 +697,14 @@ kbmain(Dev *d, int argc, char* argv[])
|
|
|
kena = pena = 1;
|
|
|
bootp = 0;
|
|
|
accel = 0;
|
|
|
+ debug = 0;
|
|
|
devid = d->id;
|
|
|
ARGBEGIN{
|
|
|
case 'a':
|
|
|
accel = strtol(EARGF(usage()), nil, 0);
|
|
|
break;
|
|
|
case 'd':
|
|
|
- kbdebug++;
|
|
|
+ debug++;
|
|
|
break;
|
|
|
case 'k':
|
|
|
kena = 1;
|
|
@@ -747,6 +745,7 @@ kbmain(Dev *d, int argc, char* argv[])
|
|
|
kd = d->aux = emallocz(sizeof(KDev), 1);
|
|
|
kd->accel = 0;
|
|
|
kd->bootp = 1;
|
|
|
+ kd->debug = debug;
|
|
|
kbstart(d, ep, &kbdin, kbdwork, kd);
|
|
|
}
|
|
|
if(pena && ep->type == Eintr && ep->dir == Ein &&
|
|
@@ -754,6 +753,7 @@ kbmain(Dev *d, int argc, char* argv[])
|
|
|
kd = d->aux = emallocz(sizeof(KDev), 1);
|
|
|
kd->accel = accel;
|
|
|
kd->bootp = bootp;
|
|
|
+ kd->debug = debug;
|
|
|
kbstart(d, ep, &ptrin, ptrwork, kd);
|
|
|
}
|
|
|
}
|