remove keyboard stuff from other ports, make openssl and python compile on arm
This commit is contained in:
parent
9adf75a709
commit
e7d3e20912
40 changed files with 81 additions and 2862 deletions
|
@ -84,8 +84,6 @@
|
|||
/* Generate 80386 code? */
|
||||
#if defined(PLAN9) && defined(T386)
|
||||
#define I386_ONLY
|
||||
#else
|
||||
#error unknown objtype
|
||||
#endif
|
||||
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
|
||||
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
|
||||
|
|
|
@ -54,7 +54,6 @@ void ioinit(void);
|
|||
int iounused(int, int);
|
||||
int irqallocread(char*, long, vlong);
|
||||
int isaconfig(char*, int, ISAConf*);
|
||||
void kbdinit(void);
|
||||
#define kexit(a)
|
||||
#define kmapinval()
|
||||
void *kmapv(uvlong, int);
|
||||
|
|
|
@ -1,456 +0,0 @@
|
|||
#include "u.h"
|
||||
#include "../port/lib.h"
|
||||
#include "mem.h"
|
||||
#include "dat.h"
|
||||
#include "fns.h"
|
||||
#include "io.h"
|
||||
#include "../port/error.h"
|
||||
|
||||
enum {
|
||||
Data= 0x60, /* data port */
|
||||
|
||||
Status= 0x64, /* status port */
|
||||
Inready= 0x01, /* input character ready */
|
||||
Outbusy= 0x02, /* output busy */
|
||||
Sysflag= 0x04, /* system flag */
|
||||
Cmddata= 0x08, /* cmd==0, data==1 */
|
||||
Inhibit= 0x10, /* keyboard/mouse inhibited */
|
||||
Minready= 0x20, /* mouse character ready */
|
||||
Rtimeout= 0x40, /* general timeout */
|
||||
Parity= 0x80,
|
||||
|
||||
Cmd= 0x64, /* command port (write only) */
|
||||
|
||||
Spec= 0x80,
|
||||
|
||||
PF= Spec|0x20, /* num pad function key */
|
||||
View= Spec|0x00, /* view (shift window up) */
|
||||
KF= 0xF000, /* function key (begin Unicode private space) */
|
||||
Shift= Spec|0x60,
|
||||
Break= Spec|0x61,
|
||||
Ctrl= Spec|0x62,
|
||||
Latin= Spec|0x63,
|
||||
Caps= Spec|0x64,
|
||||
Num= Spec|0x65,
|
||||
Middle= Spec|0x66,
|
||||
No= 0x00, /* peter */
|
||||
|
||||
Home= KF|13,
|
||||
Up= KF|14,
|
||||
Pgup= KF|15,
|
||||
Print= KF|16,
|
||||
Left= KF|17,
|
||||
Right= KF|18,
|
||||
End= '\r',
|
||||
Down= View,
|
||||
Pgdown= KF|19,
|
||||
Ins= KF|20,
|
||||
Scroll= KF|21,
|
||||
Del= 0x7F,
|
||||
};
|
||||
|
||||
/*
|
||||
* The codes at 0x79 and 0x81 are produed by the PFU Happy Hacking keyboard.
|
||||
* A 'standard' keyboard doesn't produce anything above 0x58.
|
||||
*/
|
||||
Rune kbtab[] =
|
||||
{
|
||||
[0x00] No, 0x1b, '1', '2', '3', '4', '5', '6',
|
||||
[0x08] '7', '8', '9', '0', '-', '=', '\b', '\t',
|
||||
[0x10] 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
|
||||
[0x18] 'o', 'p', '[', ']', '\n', Ctrl, 'a', 's',
|
||||
[0x20] 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
|
||||
[0x28] '\'', '`', Shift, '\\', 'z', 'x', 'c', 'v',
|
||||
[0x30] 'b', 'n', 'm', ',', '.', '/', Shift, '*',
|
||||
[0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5,
|
||||
[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, Scroll, '7',
|
||||
[0x48] '8', '9', '-', '4', '5', '6', '+', '1',
|
||||
[0x50] '2', '3', '0', '.', No, No, No, KF|11,
|
||||
[0x58] KF|12, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, View, No, Up, No, No, No, No,
|
||||
};
|
||||
|
||||
Rune kbtabshift[] =
|
||||
{
|
||||
[0x00] No, 0x1b, '!', '@', '#', '$', '%', '^',
|
||||
[0x08] '&', '*', '(', ')', '_', '+', '\b', '\t',
|
||||
[0x10] 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
|
||||
[0x18] 'O', 'P', '{', '}', '\n', Ctrl, 'A', 'S',
|
||||
[0x20] 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
|
||||
[0x28] '"', '~', Shift, '|', 'Z', 'X', 'C', 'V',
|
||||
[0x30] 'B', 'N', 'M', '<', '>', '?', Shift, '*',
|
||||
[0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5,
|
||||
[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, Scroll, '7',
|
||||
[0x48] '8', '9', '-', '4', '5', '6', '+', '1',
|
||||
[0x50] '2', '3', '0', '.', No, No, No, KF|11,
|
||||
[0x58] KF|12, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, Up, No, Up, No, No, No, No,
|
||||
};
|
||||
|
||||
Rune kbtabesc1[] =
|
||||
{
|
||||
[0x00] No, No, No, No, No, No, No, No,
|
||||
[0x08] No, No, No, No, No, No, No, No,
|
||||
[0x10] No, No, No, No, No, No, No, No,
|
||||
[0x18] No, No, No, No, '\n', Ctrl, No, No,
|
||||
[0x20] No, No, No, No, No, No, No, No,
|
||||
[0x28] No, No, Shift, No, No, No, No, No,
|
||||
[0x30] No, No, No, No, No, '/', No, Print,
|
||||
[0x38] Latin, No, No, No, No, No, No, No,
|
||||
[0x40] No, No, No, No, No, No, Break, Home,
|
||||
[0x48] Up, Pgup, No, Left, No, Right, No, End,
|
||||
[0x50] Down, Pgdown, Ins, Del, No, No, No, No,
|
||||
[0x58] No, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, Up, No, No, No, No, No, No,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
/* controller command byte */
|
||||
Cscs1= (1<<6), /* scan code set 1 */
|
||||
Cauxdis= (1<<5), /* mouse disable */
|
||||
Ckbddis= (1<<4), /* kbd disable */
|
||||
Csf= (1<<2), /* system flag */
|
||||
Cauxint= (1<<1), /* mouse interrupt enable */
|
||||
Ckbdint= (1<<0), /* kbd interrupt enable */
|
||||
};
|
||||
|
||||
static Lock i8042lock;
|
||||
static uchar ccc;
|
||||
static void (*auxputc)(int, int);
|
||||
|
||||
/*
|
||||
* wait for output no longer busy
|
||||
*/
|
||||
static int
|
||||
outready(void)
|
||||
{
|
||||
int tries;
|
||||
|
||||
for(tries = 0; (inb(Status) & Outbusy); tries++){
|
||||
if(tries > 500)
|
||||
return -1;
|
||||
delay(2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* wait for input
|
||||
*/
|
||||
static int
|
||||
inready(void)
|
||||
{
|
||||
int tries;
|
||||
|
||||
for(tries = 0; !(inb(Status) & Inready); tries++){
|
||||
if(tries > 500)
|
||||
return -1;
|
||||
delay(2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* ask 8042 to reset the machine
|
||||
*/
|
||||
void
|
||||
i8042reset(void)
|
||||
{
|
||||
ushort *s = KADDR(0x472);
|
||||
int i, x;
|
||||
|
||||
*s = 0x1234; /* BIOS warm-boot flag */
|
||||
|
||||
/*
|
||||
* newer reset the machine command
|
||||
*/
|
||||
outready();
|
||||
outb(Cmd, 0xFE);
|
||||
outready();
|
||||
|
||||
/*
|
||||
* Pulse it by hand (old somewhat reliable)
|
||||
*/
|
||||
x = 0xDF;
|
||||
for(i = 0; i < 5; i++){
|
||||
x ^= 1;
|
||||
outready();
|
||||
outb(Cmd, 0xD1);
|
||||
outready();
|
||||
outb(Data, x); /* toggle reset */
|
||||
delay(100);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
i8042auxcmd(int cmd)
|
||||
{
|
||||
unsigned int c;
|
||||
int tries;
|
||||
|
||||
c = 0;
|
||||
tries = 0;
|
||||
|
||||
ilock(&i8042lock);
|
||||
do{
|
||||
if(tries++ > 2)
|
||||
break;
|
||||
if(outready() < 0)
|
||||
break;
|
||||
outb(Cmd, 0xD4);
|
||||
if(outready() < 0)
|
||||
break;
|
||||
outb(Data, cmd);
|
||||
if(outready() < 0)
|
||||
break;
|
||||
if(inready() < 0)
|
||||
break;
|
||||
c = inb(Data);
|
||||
} while(c == 0xFE || c == 0);
|
||||
iunlock(&i8042lock);
|
||||
|
||||
if(c != 0xFA){
|
||||
print("i8042: %2.2ux returned to the %2.2ux command\n", c, cmd);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* keyboard interrupt
|
||||
*/
|
||||
static void
|
||||
i8042intr(Ureg*, void*)
|
||||
{
|
||||
int s, c, i;
|
||||
static int esc1, esc2;
|
||||
static int alt, caps, ctl, num, shift;
|
||||
static int collecting, nk;
|
||||
static Rune kc[5];
|
||||
int keyup;
|
||||
|
||||
/*
|
||||
* get status
|
||||
*/
|
||||
lock(&i8042lock);
|
||||
s = inb(Status);
|
||||
if(!(s&Inready)){
|
||||
unlock(&i8042lock);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* get the character
|
||||
*/
|
||||
c = inb(Data);
|
||||
unlock(&i8042lock);
|
||||
|
||||
/*
|
||||
* if it's the aux port...
|
||||
*/
|
||||
if(s & Minready){
|
||||
if(auxputc != nil)
|
||||
auxputc(c, shift);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* e0's is the first of a 2 character sequence
|
||||
*/
|
||||
if(c == 0xe0){
|
||||
esc1 = 1;
|
||||
return;
|
||||
} else if(c == 0xe1){
|
||||
esc2 = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
keyup = c&0x80;
|
||||
c &= 0x7f;
|
||||
if(c > sizeof kbtab){
|
||||
c |= keyup;
|
||||
if(c != 0xFF) /* these come fairly often: CAPSLOCK U Y */
|
||||
print("unknown key %ux\n", c);
|
||||
return;
|
||||
}
|
||||
|
||||
if(esc1){
|
||||
c = kbtabesc1[c];
|
||||
esc1 = 0;
|
||||
} else if(esc2){
|
||||
esc2--;
|
||||
return;
|
||||
} else if(shift)
|
||||
c = kbtabshift[c];
|
||||
else
|
||||
c = kbtab[c];
|
||||
|
||||
if(caps && c<='z' && c>='a')
|
||||
c += 'A' - 'a';
|
||||
|
||||
/*
|
||||
* keyup only important for shifts
|
||||
*/
|
||||
if(keyup){
|
||||
switch(c){
|
||||
case Latin:
|
||||
alt = 0;
|
||||
break;
|
||||
case Shift:
|
||||
shift = 0;
|
||||
break;
|
||||
case Ctrl:
|
||||
ctl = 0;
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* normal character
|
||||
*/
|
||||
if(!(c & (Spec|KF))){
|
||||
if(ctl){
|
||||
if(alt && c == Del)
|
||||
exit(0);
|
||||
c &= 0x1f;
|
||||
}
|
||||
if(!collecting){
|
||||
kbdputc(kbdq, c);
|
||||
return;
|
||||
}
|
||||
kc[nk++] = c;
|
||||
c = latin1(kc, nk);
|
||||
if(c < -1) /* need more keystrokes */
|
||||
return;
|
||||
if(c != -1) /* valid sequence */
|
||||
kbdputc(kbdq, c);
|
||||
else /* dump characters */
|
||||
for(i=0; i<nk; i++)
|
||||
kbdputc(kbdq, kc[i]);
|
||||
nk = 0;
|
||||
collecting = 0;
|
||||
return;
|
||||
} else {
|
||||
switch(c){
|
||||
case Caps:
|
||||
caps ^= 1;
|
||||
return;
|
||||
case Num:
|
||||
num ^= 1;
|
||||
return;
|
||||
case Shift:
|
||||
shift = 1;
|
||||
return;
|
||||
case Latin:
|
||||
alt = 1;
|
||||
collecting = 1;
|
||||
nk = 0;
|
||||
return;
|
||||
case Ctrl:
|
||||
ctl = 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
kbdputc(kbdq, c);
|
||||
}
|
||||
|
||||
void
|
||||
i8042auxenable(void (*putc)(int, int))
|
||||
{
|
||||
char *err = "i8042: aux init failed\n";
|
||||
|
||||
/* enable kbd/aux xfers and interrupts */
|
||||
ccc &= ~Cauxdis;
|
||||
ccc |= Cauxint;
|
||||
|
||||
ilock(&i8042lock);
|
||||
if(outready() < 0)
|
||||
print(err);
|
||||
outb(Cmd, 0x60); /* write control register */
|
||||
if(outready() < 0)
|
||||
print(err);
|
||||
outb(Data, ccc);
|
||||
if(outready() < 0)
|
||||
print(err);
|
||||
outb(Cmd, 0xA8); /* auxilliary device enable */
|
||||
if(outready() < 0){
|
||||
iunlock(&i8042lock);
|
||||
return;
|
||||
}
|
||||
auxputc = putc;
|
||||
intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux");
|
||||
iunlock(&i8042lock);
|
||||
}
|
||||
|
||||
static void
|
||||
setscan(int code)
|
||||
{
|
||||
char *err = "setscan: set scan code failed\n";
|
||||
|
||||
outb(Data, 0xF0);
|
||||
if(inready() < 0 || inb(Data) != 0xFA || outready() < 0) {
|
||||
print(err);
|
||||
return;
|
||||
}
|
||||
outb(Data, code);
|
||||
if(inready() < 0) {
|
||||
print(err);
|
||||
return;
|
||||
}
|
||||
inb(Data);
|
||||
if(outready() < 0)
|
||||
print(err);
|
||||
}
|
||||
|
||||
void
|
||||
kbdinit(void)
|
||||
{
|
||||
int c;
|
||||
|
||||
kbdq = qopen(4*1024, 0, 0, 0);
|
||||
if(kbdq == nil)
|
||||
panic("kbdinit");
|
||||
qnoblock(kbdq, 1);
|
||||
|
||||
ioalloc(Data, 1, 0, "kbd");
|
||||
ioalloc(Cmd, 1, 0, "kbd");
|
||||
|
||||
intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd");
|
||||
|
||||
/* wait for a quiescent controller */
|
||||
while((c = inb(Status)) & (Outbusy | Inready))
|
||||
if(c & Inready)
|
||||
inb(Data);
|
||||
|
||||
/* get current controller command byte */
|
||||
outb(Cmd, 0x20);
|
||||
if(inready() < 0){
|
||||
print("kbdinit: can't read ccc\n");
|
||||
ccc = 0;
|
||||
} else
|
||||
ccc = inb(Data);
|
||||
|
||||
/* enable kbd xfers and interrupts */
|
||||
/* disable mouse */
|
||||
ccc &= ~Ckbddis;
|
||||
ccc |= Csf | Ckbdint | Cscs1;
|
||||
if(outready() < 0)
|
||||
print("kbd init failed\n");
|
||||
outb(Cmd, 0x60);
|
||||
if(outready() < 0)
|
||||
print("kbd init failed\n");
|
||||
outb(Data, ccc);
|
||||
outready();
|
||||
setscan(0x02);
|
||||
}
|
|
@ -99,7 +99,6 @@ main(void)
|
|||
printinit();
|
||||
/* it's now safe to print */
|
||||
/* dumpopts(); /* DEBUG */
|
||||
kbdinit();
|
||||
i8250console();
|
||||
quotefmtinstall();
|
||||
print("\nPlan 9\n");
|
||||
|
|
|
@ -16,7 +16,6 @@ PORT=\
|
|||
chan.$O\
|
||||
dev.$O\
|
||||
fault.$O\
|
||||
latin1.$O\
|
||||
log.$O\
|
||||
edf.$O\
|
||||
mul64fract.$O\
|
||||
|
@ -46,7 +45,6 @@ OBJ=\
|
|||
fdc37c93x.$O\
|
||||
fptrap.$O\
|
||||
i8259.$O\
|
||||
kbd.$O\
|
||||
main.$O\
|
||||
mmu.$O\
|
||||
random.$O\
|
||||
|
@ -78,6 +76,9 @@ $p$CONF: $CONF.c $OBJ $LIB
|
|||
install:V: $p$CONF
|
||||
cp $p$CONF /$objtype/$p$CONF
|
||||
|
||||
rootfs.bz2:
|
||||
rc ../port/mkbootfs
|
||||
|
||||
<../boot/bootmkfile
|
||||
<../port/portmkfile
|
||||
<|../port/mkbootrules $CONF
|
||||
|
@ -95,7 +96,6 @@ clock.$O: /$objtype/include/ureg.h axp.h
|
|||
devarch.$O: axp.h
|
||||
faultalpha.$O: /$objtype/include/ureg.h
|
||||
fptrap.$O: /$objtype/include/ureg.h
|
||||
kbd.$O: /$objtype/include/ureg.h
|
||||
l.$O: osf1pal.h
|
||||
main.$O: /$objtype/include/ureg.h errstr.h init.h
|
||||
mmu.$O: /sys/src/boot/alphapc/conf.h
|
||||
|
|
|
@ -7,6 +7,7 @@ struct Cursorinfo {
|
|||
|
||||
/* devmouse.c */
|
||||
extern void mousetrack(int, int, int, int);
|
||||
extern void absmousetrack(int, int, int, int);
|
||||
extern Point mousexy(void);
|
||||
|
||||
extern void mouseaccelerate(int);
|
||||
|
|
|
@ -12,7 +12,6 @@ enum{
|
|||
Qbattery,
|
||||
Qbuttons,
|
||||
Qcruft,
|
||||
Qkbdin,
|
||||
Qled,
|
||||
Qversion,
|
||||
Qpower,
|
||||
|
@ -28,34 +27,12 @@ enum{
|
|||
SOF= 0x2, /* start of frame */
|
||||
};
|
||||
|
||||
/* from /sys/include/keyboard.h */
|
||||
enum {
|
||||
KF= 0xF000, /* Rune: beginning of private Unicode space */
|
||||
/* KF|1, KF|2, ..., KF|0xC is F1, F2, ..., F12 */
|
||||
Khome= KF|0x0D,
|
||||
Kup= KF|0x0E,
|
||||
Kpgup= KF|0x0F,
|
||||
Kprint= KF|0x10,
|
||||
Kleft= KF|0x11,
|
||||
Kright= KF|0x12,
|
||||
Kdown= 0x80,
|
||||
Kview= 0x80,
|
||||
Kpgdown= KF|0x13,
|
||||
Kins= KF|0x14,
|
||||
Kend= '\r', /* [sic] */
|
||||
|
||||
Kalt= KF|0x15,
|
||||
Kshift= KF|0x16,
|
||||
Kctl= KF|0x17,
|
||||
};
|
||||
|
||||
Dirtab µcdir[]={
|
||||
".", { Qdir, 0, QTDIR }, 0, DMDIR|0755,
|
||||
"backlight", { Qbacklight, 0 }, 0, 0664,
|
||||
"battery", { Qbattery, 0 }, 0, 0664,
|
||||
"buttons", { Qbuttons, 0 }, 0, 0664,
|
||||
"cruft", { Qcruft, 0 }, 0, 0664,
|
||||
"kbdin", { Qkbdin, 0 }, 0, 0664,
|
||||
"led", { Qled, 0 }, 0, 0664,
|
||||
"version", { Qversion, 0 }, 0, 0664,
|
||||
"power", { Qpower, 0 }, 0, 0600,
|
||||
|
@ -82,13 +59,6 @@ static struct µcontroller
|
|||
char version[16+2];
|
||||
} ctlr;
|
||||
|
||||
/* button map */
|
||||
Rune bmap[2][4] =
|
||||
{
|
||||
{Kup, Kright, Kleft, Kdown}, /* portrait mode */
|
||||
{Kright, Kdown, Kup, Kleft}, /* landscape mode */
|
||||
};
|
||||
|
||||
extern int landscape;
|
||||
|
||||
int
|
||||
|
@ -148,12 +118,8 @@ int
|
|||
b = p[0] & 0x7f;
|
||||
up = p[0] & 0x80;
|
||||
|
||||
if(b > 5) {
|
||||
/* rocker panel acts like arrow keys */
|
||||
if(b < 10 && !up)
|
||||
kbdputc(kbdq, bmap[landscape][b-6]);
|
||||
} else {
|
||||
/* the rest like mouse buttons */
|
||||
if(b <= 5){
|
||||
/* like mouse buttons */
|
||||
if(--b == 0)
|
||||
b = 5;
|
||||
penbutton(up, 1<<b);
|
||||
|
@ -359,17 +325,6 @@ static long
|
|||
extern ulong resumeaddr[];
|
||||
extern void power_resume(void);
|
||||
|
||||
if(c->qid.path == Qkbdin){
|
||||
if(n >= sizeof(str))
|
||||
n = sizeof(str)-1;
|
||||
memmove(str, a, n);
|
||||
str[n] = 0;
|
||||
for(i = 0; i < n; i += j){
|
||||
j = chartorune(&r, &str[i]);
|
||||
kbdcr2nl(nil, r);
|
||||
}
|
||||
return n;
|
||||
}
|
||||
if(c->qid.path == Qpower){
|
||||
if(!iseve())
|
||||
error(Eperm);
|
||||
|
|
|
@ -17,7 +17,6 @@ PORT=\
|
|||
dev.$O\
|
||||
edf.$O\
|
||||
fault.$O\
|
||||
latin1.$O\
|
||||
mul64fract.$O\
|
||||
rebootcmd.$O\
|
||||
page.$O\
|
||||
|
|
|
@ -21,7 +21,6 @@ PORT=\
|
|||
dev.$O\
|
||||
edf.$O\
|
||||
fault.$O\
|
||||
latin1.$O\
|
||||
mul64fract.$O\
|
||||
rebootcmd.$O\
|
||||
page.$O\
|
||||
|
|
|
@ -51,7 +51,6 @@ void iofree(int);
|
|||
void ioinit(void);
|
||||
int iprint(char*, ...);
|
||||
int isaconfig(char*, int, ISAConf*);
|
||||
void kbdinit(void);
|
||||
#define kexit(a)
|
||||
#define kmapinval()
|
||||
void links(void);
|
||||
|
|
|
@ -1,435 +0,0 @@
|
|||
#include "u.h"
|
||||
#include "../port/lib.h"
|
||||
#include "mem.h"
|
||||
#include "dat.h"
|
||||
#include "fns.h"
|
||||
#include "io.h"
|
||||
#include "../port/error.h"
|
||||
|
||||
enum {
|
||||
Data= 0x60, /* data port */
|
||||
|
||||
Status= 0x64, /* status port */
|
||||
Inready= 0x01, /* input character ready */
|
||||
Outbusy= 0x02, /* output busy */
|
||||
Sysflag= 0x04, /* system flag */
|
||||
Cmddata= 0x08, /* cmd==0, data==1 */
|
||||
Inhibit= 0x10, /* keyboard/mouse inhibited */
|
||||
Minready= 0x20, /* mouse character ready */
|
||||
Rtimeout= 0x40, /* general timeout */
|
||||
Parity= 0x80,
|
||||
|
||||
Cmd= 0x64, /* command port (write only) */
|
||||
|
||||
Spec= 0x80,
|
||||
|
||||
PF= Spec|0x20, /* num pad function key */
|
||||
View= Spec|0x00, /* view (shift window up) */
|
||||
KF= 0xF000, /* function key (begin Unicode private space) */
|
||||
Shift= Spec|0x60,
|
||||
Break= Spec|0x61,
|
||||
Ctrl= Spec|0x62,
|
||||
Latin= Spec|0x63,
|
||||
Caps= Spec|0x64,
|
||||
Num= Spec|0x65,
|
||||
Middle= Spec|0x66,
|
||||
No= 0x00, /* peter */
|
||||
|
||||
Home= KF|13,
|
||||
Up= KF|14,
|
||||
Pgup= KF|15,
|
||||
Print= KF|16,
|
||||
Left= KF|17,
|
||||
Right= KF|18,
|
||||
End= '\r',
|
||||
Down= View,
|
||||
Pgdown= KF|19,
|
||||
Ins= KF|20,
|
||||
Del= 0x7F,
|
||||
Scroll= KF|21,
|
||||
};
|
||||
|
||||
/*
|
||||
* The codes at 0x79 and 0x81 are produed by the PFU Happy Hacking keyboard.
|
||||
* A 'standard' keyboard doesn't produce anything above 0x58.
|
||||
*/
|
||||
Rune kbtab[] =
|
||||
{
|
||||
[0x00] No, 0x1b, '1', '2', '3', '4', '5', '6',
|
||||
[0x08] '7', '8', '9', '0', '-', '=', '\b', '\t',
|
||||
[0x10] 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
|
||||
[0x18] 'o', 'p', '[', ']', '\n', Ctrl, 'a', 's',
|
||||
[0x20] 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
|
||||
[0x28] '\'', '`', Shift, '\\', 'z', 'x', 'c', 'v',
|
||||
[0x30] 'b', 'n', 'm', ',', '.', '/', Shift, '*',
|
||||
[0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5,
|
||||
[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, Scroll, '7',
|
||||
[0x48] '8', '9', '-', '4', '5', '6', '+', '1',
|
||||
[0x50] '2', '3', '0', '.', No, No, No, KF|11,
|
||||
[0x58] KF|12, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, View, No, Up, No, No, No, No,
|
||||
};
|
||||
|
||||
Rune kbtabshift[] =
|
||||
{
|
||||
[0x00] No, 0x1b, '!', '@', '#', '$', '%', '^',
|
||||
[0x08] '&', '*', '(', ')', '_', '+', '\b', '\t',
|
||||
[0x10] 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
|
||||
[0x18] 'O', 'P', '{', '}', '\n', Ctrl, 'A', 'S',
|
||||
[0x20] 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
|
||||
[0x28] '"', '~', Shift, '|', 'Z', 'X', 'C', 'V',
|
||||
[0x30] 'B', 'N', 'M', '<', '>', '?', Shift, '*',
|
||||
[0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5,
|
||||
[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, Scroll, '7',
|
||||
[0x48] '8', '9', '-', '4', '5', '6', '+', '1',
|
||||
[0x50] '2', '3', '0', '.', No, No, No, KF|11,
|
||||
[0x58] KF|12, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, Up, No, Up, No, No, No, No,
|
||||
};
|
||||
|
||||
Rune kbtabesc1[] =
|
||||
{
|
||||
[0x00] No, No, No, No, No, No, No, No,
|
||||
[0x08] No, No, No, No, No, No, No, No,
|
||||
[0x10] No, No, No, No, No, No, No, No,
|
||||
[0x18] No, No, No, No, '\n', Ctrl, No, No,
|
||||
[0x20] No, No, No, No, No, No, No, No,
|
||||
[0x28] No, No, Shift, No, No, No, No, No,
|
||||
[0x30] No, No, No, No, No, '/', No, Print,
|
||||
[0x38] Latin, No, No, No, No, No, No, No,
|
||||
[0x40] No, No, No, No, No, No, Break, Home,
|
||||
[0x48] Up, Pgup, No, Left, No, Right, No, End,
|
||||
[0x50] Down, Pgdown, Ins, Del, No, No, No, No,
|
||||
[0x58] No, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, Up, No, No, No, No, No, No,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
/* controller command byte */
|
||||
Cscs1= (1<<6), /* scan code set 1 */
|
||||
Cauxdis= (1<<5), /* mouse disable */
|
||||
Ckbddis= (1<<4), /* kbd disable */
|
||||
Csf= (1<<2), /* system flag */
|
||||
Cauxint= (1<<1), /* mouse interrupt enable */
|
||||
Ckbdint= (1<<0), /* kbd interrupt enable */
|
||||
};
|
||||
|
||||
static Lock i8042lock;
|
||||
static uchar ccc;
|
||||
static void (*auxputc)(int, int);
|
||||
|
||||
/*
|
||||
* wait for output no longer busy
|
||||
*/
|
||||
static int
|
||||
outready(void)
|
||||
{
|
||||
int tries;
|
||||
|
||||
for(tries = 0; (inb(Status) & Outbusy); tries++){
|
||||
if(tries > 500)
|
||||
return -1;
|
||||
delay(2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* wait for input
|
||||
*/
|
||||
static int
|
||||
inready(void)
|
||||
{
|
||||
int tries;
|
||||
|
||||
for(tries = 0; !(inb(Status) & Inready); tries++){
|
||||
if(tries > 500)
|
||||
return -1;
|
||||
delay(2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* ask 8042 to reset the machine
|
||||
*/
|
||||
void
|
||||
i8042reset(void)
|
||||
{
|
||||
ushort *s = KADDR(0x472);
|
||||
int i, x;
|
||||
|
||||
*s = 0x1234; /* BIOS warm-boot flag */
|
||||
|
||||
/*
|
||||
* newer reset the machine command
|
||||
*/
|
||||
outready();
|
||||
outb(Cmd, 0xFE);
|
||||
outready();
|
||||
|
||||
/*
|
||||
* Pulse it by hand (old somewhat reliable)
|
||||
*/
|
||||
x = 0xDF;
|
||||
for(i = 0; i < 5; i++){
|
||||
x ^= 1;
|
||||
outready();
|
||||
outb(Cmd, 0xD1);
|
||||
outready();
|
||||
outb(Data, x); /* toggle reset */
|
||||
delay(100);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
i8042auxcmd(int cmd)
|
||||
{
|
||||
unsigned int c;
|
||||
int tries;
|
||||
|
||||
c = 0;
|
||||
tries = 0;
|
||||
|
||||
ilock(&i8042lock);
|
||||
do{
|
||||
if(tries++ > 2)
|
||||
break;
|
||||
if(outready() < 0)
|
||||
break;
|
||||
outb(Cmd, 0xD4);
|
||||
if(outready() < 0)
|
||||
break;
|
||||
outb(Data, cmd);
|
||||
if(outready() < 0)
|
||||
break;
|
||||
if(inready() < 0)
|
||||
break;
|
||||
c = inb(Data);
|
||||
} while(c == 0xFE || c == 0);
|
||||
iunlock(&i8042lock);
|
||||
|
||||
if(c != 0xFA){
|
||||
print("i8042: %2.2ux returned to the %2.2ux command\n", c, cmd);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* keyboard interrupt
|
||||
*/
|
||||
static void
|
||||
i8042intr(Ureg*, void*)
|
||||
{
|
||||
int s, c, i;
|
||||
static int esc1, esc2;
|
||||
static int alt, caps, ctl, num, shift;
|
||||
static int collecting, nk;
|
||||
static Rune kc[5];
|
||||
int keyup;
|
||||
|
||||
/*
|
||||
* get status
|
||||
*/
|
||||
lock(&i8042lock);
|
||||
s = inb(Status);
|
||||
if(!(s&Inready)){
|
||||
unlock(&i8042lock);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* get the character
|
||||
*/
|
||||
c = inb(Data);
|
||||
unlock(&i8042lock);
|
||||
|
||||
/*
|
||||
* if it's the aux port...
|
||||
*/
|
||||
if(s & Minready){
|
||||
if(auxputc != nil)
|
||||
auxputc(c, shift);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* e0's is the first of a 2 character sequence
|
||||
*/
|
||||
if(c == 0xe0){
|
||||
esc1 = 1;
|
||||
return;
|
||||
} else if(c == 0xe1){
|
||||
esc2 = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
keyup = c&0x80;
|
||||
c &= 0x7f;
|
||||
if(c > sizeof kbtab){
|
||||
c |= keyup;
|
||||
if(c != 0xFF) /* these come fairly often: CAPSLOCK U Y */
|
||||
print("unknown key %ux\n", c);
|
||||
return;
|
||||
}
|
||||
|
||||
if(esc1){
|
||||
c = kbtabesc1[c];
|
||||
esc1 = 0;
|
||||
} else if(esc2){
|
||||
esc2--;
|
||||
return;
|
||||
} else if(shift)
|
||||
c = kbtabshift[c];
|
||||
else
|
||||
c = kbtab[c];
|
||||
|
||||
if(caps && c<='z' && c>='a')
|
||||
c += 'A' - 'a';
|
||||
|
||||
/*
|
||||
* keyup only important for shifts
|
||||
*/
|
||||
if(keyup){
|
||||
switch(c){
|
||||
case Latin:
|
||||
alt = 0;
|
||||
break;
|
||||
case Shift:
|
||||
shift = 0;
|
||||
break;
|
||||
case Ctrl:
|
||||
ctl = 0;
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* normal character
|
||||
*/
|
||||
if(!(c & (Spec|KF))){
|
||||
if(ctl){
|
||||
if(alt && c == Del)
|
||||
exit(0);
|
||||
c &= 0x1f;
|
||||
}
|
||||
if(!collecting){
|
||||
kbdputc(kbdq, c);
|
||||
return;
|
||||
}
|
||||
kc[nk++] = c;
|
||||
c = latin1(kc, nk);
|
||||
if(c < -1) /* need more keystrokes */
|
||||
return;
|
||||
if(c != -1) /* valid sequence */
|
||||
kbdputc(kbdq, c);
|
||||
else /* dump characters */
|
||||
for(i=0; i<nk; i++)
|
||||
kbdputc(kbdq, kc[i]);
|
||||
nk = 0;
|
||||
collecting = 0;
|
||||
return;
|
||||
} else {
|
||||
switch(c){
|
||||
case Caps:
|
||||
caps ^= 1;
|
||||
return;
|
||||
case Num:
|
||||
num ^= 1;
|
||||
return;
|
||||
case Shift:
|
||||
shift = 1;
|
||||
return;
|
||||
case Latin:
|
||||
alt = 1;
|
||||
collecting = 1;
|
||||
nk = 0;
|
||||
return;
|
||||
case Ctrl:
|
||||
ctl = 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
kbdputc(kbdq, c);
|
||||
}
|
||||
|
||||
void
|
||||
i8042auxenable(void (*putc)(int, int))
|
||||
{
|
||||
char *err = "i8042: aux init failed\n";
|
||||
|
||||
/* enable kbd/aux xfers and interrupts */
|
||||
ccc &= ~Cauxdis;
|
||||
ccc |= Cauxint;
|
||||
|
||||
ilock(&i8042lock);
|
||||
if(outready() < 0)
|
||||
print(err);
|
||||
outb(Cmd, 0x60); /* write control register */
|
||||
if(outready() < 0)
|
||||
print(err);
|
||||
outb(Data, ccc);
|
||||
if(outready() < 0)
|
||||
print(err);
|
||||
outb(Cmd, 0xA8); /* auxilliary device enable */
|
||||
if(outready() < 0){
|
||||
iunlock(&i8042lock);
|
||||
return;
|
||||
}
|
||||
auxputc = putc;
|
||||
intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux");
|
||||
iunlock(&i8042lock);
|
||||
}
|
||||
|
||||
void
|
||||
kbdinit(void)
|
||||
{
|
||||
int c;
|
||||
|
||||
kbdq = qopen(4*1024, 0, 0, 0);
|
||||
if(kbdq == nil)
|
||||
panic("kbdinit");
|
||||
qnoblock(kbdq, 1);
|
||||
|
||||
ioalloc(Data, 1, 0, "kbd");
|
||||
ioalloc(Cmd, 1, 0, "kbd");
|
||||
|
||||
intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd");
|
||||
|
||||
/* wait for a quiescent controller */
|
||||
while((c = inb(Status)) & (Outbusy | Inready))
|
||||
if(c & Inready)
|
||||
inb(Data);
|
||||
|
||||
/* get current controller command byte */
|
||||
outb(Cmd, 0x20);
|
||||
if(inready() < 0){
|
||||
print("kbdinit: can't read ccc\n");
|
||||
ccc = 0;
|
||||
} else
|
||||
ccc = inb(Data);
|
||||
|
||||
/* enable kbd xfers and interrupts */
|
||||
/* disable mouse */
|
||||
ccc &= ~Ckbddis;
|
||||
ccc |= Csf | Ckbdint | Cscs1;
|
||||
if(outready() < 0)
|
||||
print("kbd init failed\n");
|
||||
outb(Cmd, 0x60);
|
||||
if(outready() < 0)
|
||||
print("kbd init failed\n");
|
||||
outb(Data, ccc);
|
||||
outready();
|
||||
}
|
|
@ -29,7 +29,6 @@ main(void)
|
|||
mmuinit();
|
||||
hwintrinit();
|
||||
clockinit();
|
||||
kbdinit();
|
||||
procinit0();
|
||||
initseg();
|
||||
timersinit();
|
||||
|
|
|
@ -17,7 +17,6 @@ PORT=\
|
|||
dev.$O\
|
||||
edf.$O\
|
||||
fault.$O\
|
||||
latin1.$O\
|
||||
log.$O\
|
||||
mul64fract.$O\
|
||||
rebootcmd.$O\
|
||||
|
@ -43,7 +42,6 @@ OBJ=\
|
|||
inb.$O\
|
||||
clock.$O\
|
||||
i8259.$O\
|
||||
kbd.$O\
|
||||
main.$O\
|
||||
mmu.$O\
|
||||
random.$O\
|
||||
|
|
|
@ -1281,11 +1281,6 @@ archreboot(void)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
kbdinit(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
lastresortprint(char *buf, long bp)
|
||||
{
|
||||
|
|
|
@ -25,8 +25,6 @@ dev
|
|||
|
||||
draw screen
|
||||
dss
|
||||
kbmap
|
||||
kbin
|
||||
mouse
|
||||
|
||||
uart
|
||||
|
@ -73,10 +71,11 @@ port
|
|||
|
||||
boot cpu
|
||||
tcp
|
||||
local
|
||||
|
||||
bootdir
|
||||
boot$CONF.out boot
|
||||
/arm/bin/ip/ipconfig ipconfig
|
||||
/arm/bin/auth/factotum factotum
|
||||
/arm/bin/usb/usbd
|
||||
nvram
|
||||
/arm/bin/bzfs
|
||||
/arm/bin/mntgen
|
||||
/arm/bin/auth/factotum
|
||||
rootfs.bz2
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -225,11 +225,8 @@ uartreset(void)
|
|||
p->dev = i;
|
||||
if(p->console || p->special){
|
||||
if(uartenable(p) != nil){
|
||||
if(p->console && up){
|
||||
kbdq = p->iq;
|
||||
if(p->console && up)
|
||||
serialoq = p->oq;
|
||||
p->putc = kbdcr2nl;
|
||||
}
|
||||
p->opens++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,7 +54,6 @@ extern void intrsoff(void);
|
|||
extern int isaconfig(char*, int, ISAConf*);
|
||||
extern int isdmadone(int);
|
||||
extern int ispow2(uvlong);
|
||||
extern void kbdenable(void);
|
||||
extern void l2cacheuinv(void);
|
||||
extern void l2cacheuwb(void);
|
||||
extern void l2cacheuwbinv(void);
|
||||
|
|
|
@ -1,410 +0,0 @@
|
|||
/*
|
||||
* simulated keyboard input for omap35 with no keyboard (except via uart or usb)
|
||||
*
|
||||
* gutted version of ps2 version from ../pc
|
||||
*/
|
||||
#include "u.h"
|
||||
#include "../port/lib.h"
|
||||
#include "mem.h"
|
||||
#include "dat.h"
|
||||
#include "fns.h"
|
||||
#include "io.h"
|
||||
#include "../port/error.h"
|
||||
|
||||
enum {
|
||||
Spec= 0xF800, /* Unicode private space */
|
||||
PF= Spec|0x20, /* num pad function key */
|
||||
View= Spec|0x00, /* view (shift window up) */
|
||||
KF= 0xF000, /* function key (begin Unicode private space) */
|
||||
Shift= Spec|0x60,
|
||||
Break= Spec|0x61,
|
||||
Ctrl= Spec|0x62,
|
||||
Latin= Spec|0x63,
|
||||
Caps= Spec|0x64,
|
||||
Num= Spec|0x65,
|
||||
Middle= Spec|0x66,
|
||||
Altgr= Spec|0x67,
|
||||
Kmouse= Spec|0x100,
|
||||
No= 0x00, /* peter */
|
||||
|
||||
Home= KF|13,
|
||||
Up= KF|14,
|
||||
Pgup= KF|15,
|
||||
Print= KF|16,
|
||||
Left= KF|17,
|
||||
Right= KF|18,
|
||||
End= KF|24,
|
||||
Down= View,
|
||||
Pgdown= KF|19,
|
||||
Ins= KF|20,
|
||||
Del= 0x7F,
|
||||
Scroll= KF|21,
|
||||
|
||||
Nscan= 128,
|
||||
|
||||
Int= 0, /* kbscans indices */
|
||||
Ext,
|
||||
Nscans,
|
||||
};
|
||||
|
||||
/*
|
||||
* The codes at 0x79 and 0x7b are produced by the PFU Happy Hacking keyboard.
|
||||
* A 'standard' keyboard doesn't produce anything above 0x58.
|
||||
*/
|
||||
Rune kbtab[Nscan] =
|
||||
{
|
||||
[0x00] No, 0x1b, '1', '2', '3', '4', '5', '6',
|
||||
[0x08] '7', '8', '9', '0', '-', '=', '\b', '\t',
|
||||
[0x10] 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
|
||||
[0x18] 'o', 'p', '[', ']', '\n', Ctrl, 'a', 's',
|
||||
[0x20] 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
|
||||
[0x28] '\'', '`', Shift, '\\', 'z', 'x', 'c', 'v',
|
||||
[0x30] 'b', 'n', 'm', ',', '.', '/', Shift, '*',
|
||||
[0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5,
|
||||
[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, Scroll, '7',
|
||||
[0x48] '8', '9', '-', '4', '5', '6', '+', '1',
|
||||
[0x50] '2', '3', '0', '.', No, No, No, KF|11,
|
||||
[0x58] KF|12, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, View, No, Up, No, No, No, No,
|
||||
};
|
||||
|
||||
Rune kbtabshift[Nscan] =
|
||||
{
|
||||
[0x00] No, 0x1b, '!', '@', '#', '$', '%', '^',
|
||||
[0x08] '&', '*', '(', ')', '_', '+', '\b', '\t',
|
||||
[0x10] 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
|
||||
[0x18] 'O', 'P', '{', '}', '\n', Ctrl, 'A', 'S',
|
||||
[0x20] 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
|
||||
[0x28] '"', '~', Shift, '|', 'Z', 'X', 'C', 'V',
|
||||
[0x30] 'B', 'N', 'M', '<', '>', '?', Shift, '*',
|
||||
[0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5,
|
||||
[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, Scroll, '7',
|
||||
[0x48] '8', '9', '-', '4', '5', '6', '+', '1',
|
||||
[0x50] '2', '3', '0', '.', No, No, No, KF|11,
|
||||
[0x58] KF|12, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, Up, No, Up, No, No, No, No,
|
||||
};
|
||||
|
||||
Rune kbtabesc1[Nscan] =
|
||||
{
|
||||
[0x00] No, No, No, No, No, No, No, No,
|
||||
[0x08] No, No, No, No, No, No, No, No,
|
||||
[0x10] No, No, No, No, No, No, No, No,
|
||||
[0x18] No, No, No, No, '\n', Ctrl, No, No,
|
||||
[0x20] No, No, No, No, No, No, No, No,
|
||||
[0x28] No, No, Shift, No, No, No, No, No,
|
||||
[0x30] No, No, No, No, No, '/', No, Print,
|
||||
[0x38] Altgr, No, No, No, No, No, No, No,
|
||||
[0x40] No, No, No, No, No, No, Break, Home,
|
||||
[0x48] Up, Pgup, No, Left, No, Right, No, End,
|
||||
[0x50] Down, Pgdown, Ins, Del, No, No, No, No,
|
||||
[0x58] No, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, Up, No, No, No, No, No, No,
|
||||
};
|
||||
|
||||
Rune kbtabaltgr[Nscan] =
|
||||
{
|
||||
[0x00] No, No, No, No, No, No, No, No,
|
||||
[0x08] No, No, No, No, No, No, No, No,
|
||||
[0x10] No, No, No, No, No, No, No, No,
|
||||
[0x18] No, No, No, No, '\n', Ctrl, No, No,
|
||||
[0x20] No, No, No, No, No, No, No, No,
|
||||
[0x28] No, No, Shift, No, No, No, No, No,
|
||||
[0x30] No, No, No, No, No, '/', No, Print,
|
||||
[0x38] Altgr, No, No, No, No, No, No, No,
|
||||
[0x40] No, No, No, No, No, No, Break, Home,
|
||||
[0x48] Up, Pgup, No, Left, No, Right, No, End,
|
||||
[0x50] Down, Pgdown, Ins, Del, No, No, No, No,
|
||||
[0x58] No, No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, Up, No, No, No, No, No, No,
|
||||
};
|
||||
|
||||
Rune kbtabctrl[Nscan] =
|
||||
{
|
||||
[0x00] No, '', '', '', '', '', '', '',
|
||||
[0x08] '', '', '', '', '
', '', '\b', '\t',
|
||||
[0x10] '', '', '', '', '', '', '', '\t',
|
||||
[0x18] '', '', '', '', '\n', Ctrl, '', '',
|
||||
[0x20] '', '', '', '\b', '\n', '', '', '',
|
||||
[0x28] '', No, Shift, '', '', '', '', '',
|
||||
[0x30] '', '', '
', '', '', '', Shift, '\n',
|
||||
[0x38] Latin, No, Ctrl, '', '', '', '', '',
|
||||
[0x40] '', '', '', '
', '', '', '', '',
|
||||
[0x48] '', '', '
', '', '', '', '', '',
|
||||
[0x50] '', '', '', '', No, No, No, '',
|
||||
[0x58] '', No, No, No, No, No, No, No,
|
||||
[0x60] No, No, No, No, No, No, No, No,
|
||||
[0x68] No, No, No, No, No, No, No, No,
|
||||
[0x70] No, No, No, No, No, No, No, No,
|
||||
[0x78] No, '', No, '\b', No, No, No, No,
|
||||
};
|
||||
|
||||
int mouseshifted;
|
||||
void (*kbdmouse)(int);
|
||||
|
||||
static int kdebug;
|
||||
|
||||
typedef struct Kbscan Kbscan;
|
||||
struct Kbscan {
|
||||
int esc1;
|
||||
int esc2;
|
||||
int alt;
|
||||
int altgr;
|
||||
int caps;
|
||||
int ctl;
|
||||
int num;
|
||||
int shift;
|
||||
int collecting;
|
||||
int nk;
|
||||
Rune kc[5];
|
||||
int buttons;
|
||||
};
|
||||
|
||||
Kbscan kbscans[Nscans]; /* kernel and external scan code state */
|
||||
|
||||
/*
|
||||
* Scan code processing
|
||||
*/
|
||||
void
|
||||
kbdputsc(int c, int external)
|
||||
{
|
||||
int i, keyup;
|
||||
Kbscan *kbscan;
|
||||
|
||||
if(external)
|
||||
kbscan = &kbscans[Ext];
|
||||
else
|
||||
kbscan = &kbscans[Int];
|
||||
|
||||
if(kdebug)
|
||||
print("sc %x ms %d\n", c, mouseshifted);
|
||||
/*
|
||||
* e0's is the first of a 2 character sequence, e1 the first
|
||||
* of a 3 character sequence (on the safari)
|
||||
*/
|
||||
if(c == 0xe0){
|
||||
kbscan->esc1 = 1;
|
||||
return;
|
||||
} else if(c == 0xe1){
|
||||
kbscan->esc2 = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
keyup = c & 0x80;
|
||||
c &= 0x7f;
|
||||
if(c > sizeof kbtab){
|
||||
c |= keyup;
|
||||
if(c != 0xFF) /* these come fairly often: CAPSLOCK U Y */
|
||||
print("unknown key %ux\n", c);
|
||||
return;
|
||||
}
|
||||
|
||||
if(kbscan->esc1){
|
||||
c = kbtabesc1[c];
|
||||
kbscan->esc1 = 0;
|
||||
} else if(kbscan->esc2){
|
||||
kbscan->esc2--;
|
||||
return;
|
||||
} else if(kbscan->shift)
|
||||
c = kbtabshift[c];
|
||||
else if(kbscan->altgr)
|
||||
c = kbtabaltgr[c];
|
||||
else if(kbscan->ctl)
|
||||
c = kbtabctrl[c];
|
||||
else
|
||||
c = kbtab[c];
|
||||
|
||||
if(kbscan->caps && c<='z' && c>='a')
|
||||
c += 'A' - 'a';
|
||||
|
||||
/*
|
||||
* keyup only important for shifts
|
||||
*/
|
||||
if(keyup){
|
||||
switch(c){
|
||||
case Latin:
|
||||
kbscan->alt = 0;
|
||||
break;
|
||||
case Shift:
|
||||
kbscan->shift = 0;
|
||||
mouseshifted = 0;
|
||||
if(kdebug)
|
||||
print("shiftclr\n");
|
||||
break;
|
||||
case Ctrl:
|
||||
kbscan->ctl = 0;
|
||||
break;
|
||||
case Altgr:
|
||||
kbscan->altgr = 0;
|
||||
break;
|
||||
case Kmouse|1:
|
||||
case Kmouse|2:
|
||||
case Kmouse|3:
|
||||
case Kmouse|4:
|
||||
case Kmouse|5:
|
||||
kbscan->buttons &= ~(1<<(c-Kmouse-1));
|
||||
if(kbdmouse)
|
||||
kbdmouse(kbscan->buttons);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* normal character
|
||||
*/
|
||||
if(!(c & (Spec|KF))){
|
||||
if(kbscan->ctl)
|
||||
if(kbscan->alt && c == Del)
|
||||
exit(0);
|
||||
if(!kbscan->collecting){
|
||||
kbdputc(kbdq, c);
|
||||
return;
|
||||
}
|
||||
kbscan->kc[kbscan->nk++] = c;
|
||||
c = latin1(kbscan->kc, kbscan->nk);
|
||||
if(c < -1) /* need more keystrokes */
|
||||
return;
|
||||
if(c != -1) /* valid sequence */
|
||||
kbdputc(kbdq, c);
|
||||
else /* dump characters */
|
||||
for(i=0; i<kbscan->nk; i++)
|
||||
kbdputc(kbdq, kbscan->kc[i]);
|
||||
kbscan->nk = 0;
|
||||
kbscan->collecting = 0;
|
||||
return;
|
||||
} else {
|
||||
switch(c){
|
||||
case Caps:
|
||||
kbscan->caps ^= 1;
|
||||
return;
|
||||
case Num:
|
||||
kbscan->num ^= 1;
|
||||
return;
|
||||
case Shift:
|
||||
kbscan->shift = 1;
|
||||
if(kdebug)
|
||||
print("shift\n");
|
||||
mouseshifted = 1;
|
||||
return;
|
||||
case Latin:
|
||||
kbscan->alt = 1;
|
||||
/*
|
||||
* VMware and Qemu use Ctl-Alt as the key combination
|
||||
* to make the VM give up keyboard and mouse focus.
|
||||
* This has the unfortunate side effect that when you
|
||||
* come back into focus, Plan 9 thinks you want to type
|
||||
* a compose sequence (you just typed alt).
|
||||
*
|
||||
* As a clumsy hack around this, we look for ctl-alt
|
||||
* and don't treat it as the start of a compose sequence.
|
||||
*/
|
||||
if(!kbscan->ctl){
|
||||
kbscan->collecting = 1;
|
||||
kbscan->nk = 0;
|
||||
}
|
||||
return;
|
||||
case Ctrl:
|
||||
kbscan->ctl = 1;
|
||||
return;
|
||||
case Altgr:
|
||||
kbscan->altgr = 1;
|
||||
return;
|
||||
case Kmouse|1:
|
||||
case Kmouse|2:
|
||||
case Kmouse|3:
|
||||
case Kmouse|4:
|
||||
case Kmouse|5:
|
||||
kbscan->buttons |= 1<<(c-Kmouse-1);
|
||||
if(kbdmouse)
|
||||
kbdmouse(kbscan->buttons);
|
||||
return;
|
||||
case KF|11:
|
||||
print("kbd debug on, F12 turns it off\n");
|
||||
kdebug = 1;
|
||||
break;
|
||||
case KF|12:
|
||||
kdebug = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
kbdputc(kbdq, c);
|
||||
}
|
||||
|
||||
void
|
||||
kbdenable(void)
|
||||
{
|
||||
#ifdef notdef
|
||||
kbdq = qopen(4*1024, 0, 0, 0);
|
||||
if(kbdq == nil)
|
||||
panic("kbdinit");
|
||||
qnoblock(kbdq, 1);
|
||||
#endif
|
||||
kbscans[Int].num = 0;
|
||||
}
|
||||
|
||||
void
|
||||
kbdputmap(ushort m, ushort scanc, Rune r)
|
||||
{
|
||||
if(scanc >= Nscan)
|
||||
error(Ebadarg);
|
||||
switch(m) {
|
||||
default:
|
||||
error(Ebadarg);
|
||||
case 0:
|
||||
kbtab[scanc] = r;
|
||||
break;
|
||||
case 1:
|
||||
kbtabshift[scanc] = r;
|
||||
break;
|
||||
case 2:
|
||||
kbtabesc1[scanc] = r;
|
||||
break;
|
||||
case 3:
|
||||
kbtabaltgr[scanc] = r;
|
||||
break;
|
||||
case 4:
|
||||
kbtabctrl[scanc] = r;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
kbdgetmap(uint offset, int *t, int *sc, Rune *r)
|
||||
{
|
||||
if ((int)offset < 0)
|
||||
error(Ebadarg);
|
||||
*t = offset/Nscan;
|
||||
*sc = offset%Nscan;
|
||||
switch(*t) {
|
||||
default:
|
||||
return 0;
|
||||
case 0:
|
||||
*r = kbtab[*sc];
|
||||
return 1;
|
||||
case 1:
|
||||
*r = kbtabshift[*sc];
|
||||
return 1;
|
||||
case 2:
|
||||
*r = kbtabesc1[*sc];
|
||||
return 1;
|
||||
case 3:
|
||||
*r = kbtabaltgr[*sc];
|
||||
return 1;
|
||||
case 4:
|
||||
*r = kbtabctrl[*sc];
|
||||
return 1;
|
||||
}
|
||||
}
|
|
@ -259,7 +259,7 @@ wave('l');
|
|||
|
||||
delay(250); /* let uart catch up */
|
||||
printinit();
|
||||
kbdenable();
|
||||
// kbdenable();
|
||||
|
||||
cpuidprint();
|
||||
// chkmissing();
|
||||
|
@ -445,8 +445,6 @@ init0(void)
|
|||
dmatest(); /* needs `up' set, so can't do it earlier */
|
||||
chandevinit();
|
||||
i8250console(); /* might be redundant, but harmless */
|
||||
if(kbdq == nil)
|
||||
panic("init0: nil kbdq");
|
||||
if(serialoq == nil)
|
||||
panic("init0: nil serialoq");
|
||||
normalprint = 1;
|
||||
|
|
|
@ -22,7 +22,6 @@ PORT=\
|
|||
dev.$O\
|
||||
edf.$O\
|
||||
fault.$O\
|
||||
latin1.$O\
|
||||
mul64fract.$O\
|
||||
rebootcmd.$O\
|
||||
page.$O\
|
||||
|
@ -50,7 +49,6 @@ OBJ=\
|
|||
fpi.$O\
|
||||
fpiarm.$O\
|
||||
fpimem.$O\
|
||||
kbd.$O\
|
||||
main.$O\
|
||||
mmu.$O\
|
||||
random.$O\
|
||||
|
@ -94,6 +92,9 @@ install:V: /$objtype/$p$CONF
|
|||
wait
|
||||
touch $target
|
||||
|
||||
rootfs.bz2:
|
||||
rc ../port/mkbootfs
|
||||
|
||||
<../boot/bootmkfile
|
||||
<../port/portmkfile
|
||||
<|../port/mkbootrules $CONF
|
||||
|
|
|
@ -15,6 +15,7 @@ extern Cursorinfo cursor;
|
|||
|
||||
/* devmouse.c */
|
||||
extern void mousetrack(int, int, int, int);
|
||||
extern void absmousetrack(int, int, int, int);
|
||||
extern Point mousexy(void);
|
||||
|
||||
extern void mouseaccelerate(int);
|
||||
|
|
|
@ -812,9 +812,7 @@ i8250console(void)
|
|||
|
||||
if(uartenable(uart) != nil /* && uart->console */){
|
||||
// iprint("i8250console: enabling console uart\n");
|
||||
kbdq = uart->iq;
|
||||
serialoq = uart->oq;
|
||||
uart->putc = kbdcr2nl;
|
||||
uart->opens++;
|
||||
consuart = uart;
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ PORT=\
|
|||
dev.$O\
|
||||
edf.$O\
|
||||
fault.$O\
|
||||
latin1.$O\
|
||||
page.$O\
|
||||
parse.$O\
|
||||
pgrp.$O\
|
||||
|
|
|
@ -8,6 +8,8 @@ struct Audio
|
|||
void *ctlr;
|
||||
void *mixer;
|
||||
|
||||
Ref audioopen;
|
||||
|
||||
long (*read)(Audio *, void *, long, vlong);
|
||||
long (*write)(Audio *, void *, long, vlong);
|
||||
void (*close)(Audio *);
|
||||
|
|
|
@ -49,7 +49,7 @@ static Audioprobe audioprobes[16];
|
|||
static Audio *audiodevs;
|
||||
|
||||
static char Evolume[] = "illegal volume specifier";
|
||||
|
||||
static char Ebusy[] = "device is busy";
|
||||
|
||||
void
|
||||
addaudiocard(char *name, int (*probefn)(Audio *))
|
||||
|
@ -170,6 +170,15 @@ audioattach(char *spec)
|
|||
static Chan*
|
||||
audioopen(Chan *c, int omode)
|
||||
{
|
||||
Audiochan *ac;
|
||||
Audio *adev;
|
||||
|
||||
ac = c->aux;
|
||||
adev = ac->adev;
|
||||
if(c->qid.path == Qaudio && incref(&adev->audioopen) != 1){
|
||||
decref(&adev->audioopen);
|
||||
error(Ebusy);
|
||||
}
|
||||
return devopen(c, omode, audiodir, nelem(audiodir), devgen);
|
||||
}
|
||||
|
||||
|
@ -291,9 +300,11 @@ audioclose(Chan *c)
|
|||
|
||||
ac = c->aux;
|
||||
adev = ac->adev;
|
||||
if(c->qid.path == Qaudio && (c->flag & COPEN))
|
||||
if(c->qid.path == Qaudio && (c->flag & COPEN)){
|
||||
if(adev->close)
|
||||
adev->close(adev);
|
||||
decref(&adev->audioopen);
|
||||
}
|
||||
|
||||
if(ac->owner == c){
|
||||
ac->owner = nil;
|
||||
|
|
|
@ -72,15 +72,12 @@ static Cmdtab mousectlmsg[] =
|
|||
Mouseinfo mouse;
|
||||
Cursorinfo cursor;
|
||||
int mouseshifted;
|
||||
int kbdbuttons;
|
||||
void (*kbdmouse)(int);
|
||||
Cursor curs;
|
||||
|
||||
void Cursortocursor(Cursor*);
|
||||
int mousechanged(void*);
|
||||
|
||||
static void mouseclock(void);
|
||||
static void xkbdmouse(int);
|
||||
|
||||
enum{
|
||||
Qdir,
|
||||
|
@ -120,13 +117,6 @@ mousereset(void)
|
|||
addclock0link(mouseclock, 33);
|
||||
}
|
||||
|
||||
static void
|
||||
mousefromkbd(int buttons)
|
||||
{
|
||||
kbdbuttons = buttons;
|
||||
mousetrack(0, 0, 0, TK2MS(MACHP(0)->ticks));
|
||||
}
|
||||
|
||||
static int
|
||||
mousedevgen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp)
|
||||
{
|
||||
|
@ -147,7 +137,6 @@ mouseinit(void)
|
|||
curs = arrow;
|
||||
Cursortocursor(&arrow);
|
||||
cursoron(1);
|
||||
kbdmouse = mousefromkbd;
|
||||
mousetime = seconds();
|
||||
}
|
||||
|
||||
|
@ -603,7 +592,7 @@ mousetrack(int dx, int dy, int b, int msec)
|
|||
|
||||
lastb = mouse.buttons;
|
||||
mouse.xy = Pt(x, y);
|
||||
mouse.buttons = b|kbdbuttons;
|
||||
mouse.buttons = b;
|
||||
mouse.redraw = 1;
|
||||
mouse.counter++;
|
||||
mouse.msec = msec;
|
||||
|
@ -642,7 +631,7 @@ absmousetrack(int x, int y, int b, int msec)
|
|||
|
||||
lastb = mouse.buttons;
|
||||
mouse.xy = Pt(x, y);
|
||||
mouse.buttons = b|kbdbuttons;
|
||||
mouse.buttons = b;
|
||||
mouse.redraw = 1;
|
||||
mouse.counter++;
|
||||
mouse.msec = msec;
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
#include <u.h>
|
||||
|
||||
/*
|
||||
* The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
|
||||
* prefix of latintab[j].ld only when j<i.
|
||||
*/
|
||||
struct cvlist
|
||||
{
|
||||
char *ld; /* must be seen before using this conversion */
|
||||
char *si; /* options for last input characters */
|
||||
Rune *so; /* the corresponding Rune for each si entry */
|
||||
} latintab[] = {
|
||||
#include "../port/latin1.h"
|
||||
0, 0, 0
|
||||
};
|
||||
|
||||
/*
|
||||
* Given 5 characters k[0]..k[4], find the rune or return -1 for failure.
|
||||
*/
|
||||
long
|
||||
unicode(Rune *k)
|
||||
{
|
||||
long i, c;
|
||||
|
||||
k++; /* skip 'X' */
|
||||
c = 0;
|
||||
for(i=0; i<4; i++,k++){
|
||||
c <<= 4;
|
||||
if('0'<=*k && *k<='9')
|
||||
c += *k-'0';
|
||||
else if('a'<=*k && *k<='f')
|
||||
c += 10 + *k-'a';
|
||||
else if('A'<=*k && *k<='F')
|
||||
c += 10 + *k-'A';
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/*
|
||||
* Given n characters k[0]..k[n-1], find the corresponding rune or return -1 for
|
||||
* failure, or something < -1 if n is too small. In the latter case, the result
|
||||
* is minus the required n.
|
||||
*/
|
||||
long
|
||||
latin1(Rune *k, int n)
|
||||
{
|
||||
struct cvlist *l;
|
||||
int c;
|
||||
char* p;
|
||||
|
||||
if(k[0] == 'X')
|
||||
if(n>=5)
|
||||
return unicode(k);
|
||||
else
|
||||
return -5;
|
||||
for(l=latintab; l->ld!=0; l++)
|
||||
if(k[0] == l->ld[0]){
|
||||
if(n == 1)
|
||||
return -2;
|
||||
if(l->ld[1] == 0)
|
||||
c = k[1];
|
||||
else if(l->ld[1] != k[1])
|
||||
continue;
|
||||
else if(n == 2)
|
||||
return -3;
|
||||
else
|
||||
c = k[2];
|
||||
for(p=l->si; *p!=0; p++)
|
||||
if(*p == c)
|
||||
return l->so[p - l->si];
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
|
@ -766,8 +766,6 @@ extern Dev* devtab[];
|
|||
extern char* eve;
|
||||
extern char hostdomain[];
|
||||
extern uchar initcode[];
|
||||
extern int kbdbuttons;
|
||||
extern Queue* kbdq;
|
||||
extern Queue* kprintoq;
|
||||
extern Ref noteidalloc;
|
||||
extern int nsyscall;
|
||||
|
|
|
@ -150,7 +150,6 @@ void (*kproftimer)(ulong);
|
|||
void ksetenv(char*, char*, int);
|
||||
void kstrcpy(char*, char*, int);
|
||||
void kstrdup(char**, char*);
|
||||
long latin1(Rune*, int);
|
||||
int lock(Lock*);
|
||||
void logopen(Log*);
|
||||
void logclose(Log*);
|
||||
|
|
|
@ -59,9 +59,6 @@ $CONF.c: ../port/mkdevc $CONF
|
|||
errstr.h: ../port/mkerrstr ../port/error.h
|
||||
rc ../port/mkerrstr > errstr.h
|
||||
|
||||
../port/latin1.h: /lib/keyboard
|
||||
aux/mklatinkbd /lib/keyboard > ../port/latin1.h
|
||||
|
||||
%.db: main.$O
|
||||
$CC -s$stem main.c | dbfmt > $stem.db
|
||||
|
||||
|
@ -69,6 +66,7 @@ alloc.$O: /sys/include/pool.h
|
|||
devmnt.$O: /sys/include/fcall.h
|
||||
proc.$O: errstr.h
|
||||
devroot.$O: errstr.h
|
||||
devaudio.$O: ../port/audioif.h
|
||||
devaoe.$O: /$objtype/include/ureg.h
|
||||
devfs.$O: /$objtype/include/ureg.h
|
||||
devsd.$O: /$objtype/include/ureg.h
|
||||
|
@ -83,7 +81,6 @@ devuart.$O: ../port/netif.h
|
|||
devmouse.$O: screen.h /sys/include/memdraw.h
|
||||
devdraw.$O: screen.h /sys/include/memdraw.h
|
||||
screen.$O: screen.h /sys/include/memdraw.h
|
||||
latin1.$O: ../port/latin1.h
|
||||
thwack.$O: ../port/thwack.h
|
||||
unthwack.$O: ../port/thwack.h
|
||||
devsdp.$O: ../port/thwack.h
|
||||
|
|
|
@ -19,7 +19,6 @@ PORT=\
|
|||
dev.$O\
|
||||
edf.$O\
|
||||
fault.$O\
|
||||
latin1.$O\
|
||||
log.$O\
|
||||
rebootcmd.$O\
|
||||
page.$O\
|
||||
|
|
|
@ -156,9 +156,13 @@ static PY_LONG_LONG CallExternalTimer(ProfilerObject *pObj)
|
|||
return result;
|
||||
}
|
||||
|
||||
#define CALL_TIMER(pObj) ((pObj)->externalTimer ? \
|
||||
CallExternalTimer(pObj) : \
|
||||
hpTimer())
|
||||
static PY_LONG_LONG
|
||||
CALL_TIMER(ProfilerObject *pObj)
|
||||
{
|
||||
if(pObj->externalTimer)
|
||||
return CallExternalTimer(pObj);
|
||||
return hpTimer();
|
||||
}
|
||||
|
||||
/*** ProfilerObject ***/
|
||||
|
||||
|
|
|
@ -1007,8 +1007,10 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args)
|
|||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||
offset = PyInt_AsLong(offobj);
|
||||
#else
|
||||
offset = PyLong_Check(offobj) ?
|
||||
PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
|
||||
if(PyLong_Check(offobj))
|
||||
offset = PyLong_AsLongLong(offobj);
|
||||
else
|
||||
offset = PyInt_AsLong(offobj);
|
||||
#endif
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
|
|
@ -339,9 +339,10 @@ fcntl_lockf(PyObject *self, PyObject *args)
|
|||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||
l.l_start = PyInt_AsLong(startobj);
|
||||
#else
|
||||
l.l_start = PyLong_Check(startobj) ?
|
||||
PyLong_AsLongLong(startobj) :
|
||||
PyInt_AsLong(startobj);
|
||||
if(PyLong_Check(startobj))
|
||||
l.l_start = PyLong_AsLongLong(startobj);
|
||||
else
|
||||
l.l_start = PyInt_AsLong(startobj);
|
||||
#endif
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
@ -350,9 +351,10 @@ fcntl_lockf(PyObject *self, PyObject *args)
|
|||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||
l.l_len = PyInt_AsLong(lenobj);
|
||||
#else
|
||||
l.l_len = PyLong_Check(lenobj) ?
|
||||
PyLong_AsLongLong(lenobj) :
|
||||
PyInt_AsLong(lenobj);
|
||||
if(PyLong_Check(lenobj))
|
||||
l.l_len = PyLong_AsLongLong(lenobj);
|
||||
else
|
||||
l.l_len = PyInt_AsLong(lenobj);
|
||||
#endif
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
|
|
@ -6053,8 +6053,10 @@ posix_lseek(PyObject *self, PyObject *args)
|
|||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||
pos = PyInt_AsLong(posobj);
|
||||
#else
|
||||
pos = PyLong_Check(posobj) ?
|
||||
PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
|
||||
if(PyLong_Check(posobj))
|
||||
pos = PyLong_AsLongLong(posobj);
|
||||
else
|
||||
pos = PyInt_AsLong(posobj);
|
||||
#endif
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
@ -6384,8 +6386,10 @@ posix_ftruncate(PyObject *self, PyObject *args)
|
|||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||
length = PyInt_AsLong(lenobj);
|
||||
#else
|
||||
length = PyLong_Check(lenobj) ?
|
||||
PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
|
||||
if(PyLong_Check(lenobj))
|
||||
length = PyLong_AsLongLong(lenobj);
|
||||
else
|
||||
length = PyInt_AsLong(lenobj);
|
||||
#endif
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
|
|
@ -25,16 +25,19 @@ TESTNAME(PyObject *error(const char*))
|
|||
base = 1;
|
||||
for (i = 0;
|
||||
i < NBITS + 1; /* on last, base overflows to 0 */
|
||||
++i, base <<= 1)
|
||||
++i)
|
||||
{
|
||||
int j;
|
||||
|
||||
for (j = 0; j < 6; ++j) {
|
||||
TYPENAME in, out;
|
||||
unsigned TYPENAME uin, uout;
|
||||
|
||||
/* For 0, 1, 2 use base; for 3, 4, 5 use -base */
|
||||
uin = j < 3 ? base
|
||||
: (unsigned TYPENAME)(-(TYPENAME)base);
|
||||
if(j < 3)
|
||||
uin = base;
|
||||
else
|
||||
uin = (unsigned TYPENAME)(-(TYPENAME)base);
|
||||
|
||||
/* For 0 & 3, subtract 1.
|
||||
* For 1 & 4, leave alone.
|
||||
|
@ -71,6 +74,8 @@ TESTNAME(PyObject *error(const char*))
|
|||
"signed output != input");
|
||||
UNBIND(pyresult);
|
||||
}
|
||||
|
||||
base <<= 1;
|
||||
}
|
||||
|
||||
/* Overflow tests. The loop above ensured that all limit cases that
|
||||
|
|
|
@ -553,8 +553,10 @@ file_seek(PyFileObject *f, PyObject *args)
|
|||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||
offset = PyInt_AsLong(offobj);
|
||||
#else
|
||||
offset = PyLong_Check(offobj) ?
|
||||
PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
|
||||
if(PyLong_Check(offobj))
|
||||
offset = PyLong_AsLongLong(offobj);
|
||||
else
|
||||
offset = PyInt_AsLong(offobj);
|
||||
#endif
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
@ -610,9 +612,10 @@ file_truncate(PyFileObject *f, PyObject *args)
|
|||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||
newsize = PyInt_AsLong(newsizeobj);
|
||||
#else
|
||||
newsize = PyLong_Check(newsizeobj) ?
|
||||
PyLong_AsLongLong(newsizeobj) :
|
||||
PyInt_AsLong(newsizeobj);
|
||||
if(PyLong_Check(newsizeobj))
|
||||
newsize = PyLong_AsLongLong(newsizeobj);
|
||||
else
|
||||
newsize = PyInt_AsLong(newsizeobj);
|
||||
#endif
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
|
|
@ -971,7 +971,7 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp)
|
|||
if (filesize <= SMALL_FILE_LIMIT)
|
||||
pBuf = buf;
|
||||
else if (filesize <= REASONABLE_FILE_LIMIT)
|
||||
pBuf = (char *)PyMem_MALLOC(filesize);
|
||||
pBuf = (char *)PyMem_MALLOC((int)filesize);
|
||||
if (pBuf != NULL) {
|
||||
PyObject* v;
|
||||
size_t n;
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#if defined(T386)
|
||||
#define FPINVAL (1<<0)
|
||||
#elif defined(Tarm)
|
||||
#define FPINVAL (1<<16)
|
||||
#else
|
||||
Error define FPINVAL for your arch. grep /$cputype/include/u.h
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue