ref: 7ae64cec1099b114d7076690ec56515207498ba3
parent: 8589a591dee9ccb46e09fbb5bf6962cabd178f98
parent: 1b8d87555a0905e5a83000066518c85a2a85b204
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Mar 28 16:33:47 EDT 2020
merge
--- a/sys/man/3/kbd
+++ b/sys/man/3/kbd
@@ -7,6 +7,7 @@
.B /dev/scancode
.B /dev/leds
+.B /dev/repeat
.fi
.SH DESCRIPTION
.PP
@@ -13,9 +14,10 @@
The
.I kbd
device serves a one-level directory containing the files
-.BR scancode
+.BR scancode ,
+.BR leds
and
-.BR leds .
+.BR repeat .
.PP
Reading the
.BR scancode
@@ -29,13 +31,26 @@
.PP
Writing a number to the write-only
.BR leds
-file changes the status leds on the keyboard. the value of the
+file changes the status leds on the keyboard. The value of the
number is the addition of 1, 2 and 4 representing activated
Scroll, Num and Caps leds.
+.PP
+The
+.BR repeat
+file sets typematic rate and delay. The value of the number is a
+bitmask where first 5 bits set the repeat rate (ranging from 0b00000
+for 30Hz to 0b11111 for 2Hz). Bits 6 and 7 set the delay before the
+first repeat is activated (ranging from 0b00 for 250Hz to 0b11 for
+1000Hz).
.SH EXAMPLE
Set the Scroll and Caps leds:
.EX
echo 5 >/dev/leds
+.EE
+.PP
+Enable fast repeat rate and the least delay:
+.EX
+echo 0 >/dev/repeat
.EE
.SH "SEE ALSO"
.IR kbdfs (8)
--- a/sys/src/9/pc/devkbd.c
+++ b/sys/src/9/pc/devkbd.c
@@ -40,6 +40,7 @@
Qdir,
Qscancode,
Qleds,
+ Qrepeat,
};
static Dirtab kbdtab[] = {
@@ -46,6 +47,7 @@
".", {Qdir, 0, QTDIR}, 0, 0555,
"scancode", {Qscancode, 0}, 0, 0440,
"leds", {Qleds, 0}, 0, 0220,
+ "repeat", {Qrepeat, 0}, 0, 0220,
};
static Lock i8042lock;
@@ -193,6 +195,28 @@
iunlock(&i8042lock);
}
+static void
+setrepeat(int repeat)
+{
+ if(nokbd)
+ return;
+
+ repeat &= 0x7f;
+ ilock(&i8042lock);
+ for(;;){
+ if(outready() < 0)
+ break;
+ outb(Data, 0xf3); /* `set typematic rate and delay' */
+ if(outready() < 0)
+ break;
+ outb(Data, repeat);
+ if(outready() < 0)
+ break;
+ break;
+ }
+ iunlock(&i8042lock);
+}
+
/*
* keyboard interrupt
*/
@@ -357,9 +381,6 @@
{
char tmp[8+1], *p;
- if(c->qid.path != Qleds)
- error(Egreg);
-
p = tmp + n;
if(n >= sizeof(tmp))
p = tmp + sizeof(tmp)-1;
@@ -366,7 +387,12 @@
memmove(tmp, a, p - tmp);
*p = 0;
- setleds(atoi(tmp));
+ if(c->qid.path == Qleds)
+ setleds(atoi(tmp));
+ else if(c->qid.path == Qrepeat)
+ setrepeat(atoi(tmp));
+ else
+ error(Egreg);
return n;
}
--- a/sys/src/9/pc/mkfile
+++ b/sys/src/9/pc/mkfile
@@ -139,10 +139,10 @@
$LD -l -R1 -s -o $target $prereq
rebootcode.out: rebootcode.$O
- $LD -l -R4 -s -o $target -T$REBOOTADDR $prereq
+ $LD -l -R4 -s -o $target -T$REBOOTADDR -H3 $prereq
apbootstrap.out: apbootstrap.$O
- $LD -l -R4 -s -o $target -T$APBOOTSTRAP $prereq
+ $LD -l -R4 -s -o $target -T$APBOOTSTRAP -H3 $prereq
sd53c8xx.i: sd53c8xx.n
aux/na $prereq > $target
--- a/sys/src/9/pc/pci.c
+++ b/sys/src/9/pc/pci.c
@@ -1083,7 +1083,7 @@
*/
for(p=pciroot; p; p=p->list)
for(i=0; i<nelem(p->mem); i++)
- if(p->mem[i].bar && (p->mem[i].bar&1) == 0)
+ if((p->mem[i].bar&~4) != 0 && (p->mem[i].bar&1) == 0)
upareserve(p->mem[i].bar&~0x0F, p->mem[i].size);
}
--- a/sys/src/cmd/grep/main.c
+++ b/sys/src/cmd/grep/main.c
@@ -91,7 +91,7 @@
}
if(flags['b'])
- flag ^= Bflag; /* dont buffer output */
+ flag |= Bflag; /* dont buffer output */
if(flags['c'])
flag |= Cflag; /* count */
if(flags['h'])