remove keyboard stuff from other ports, make openssl and python compile on arm
This commit is contained in:
parent
9adf75a709
commit
e7d3e20912
|
@ -84,8 +84,6 @@
|
||||||
/* Generate 80386 code? */
|
/* Generate 80386 code? */
|
||||||
#if defined(PLAN9) && defined(T386)
|
#if defined(PLAN9) && defined(T386)
|
||||||
#define I386_ONLY
|
#define I386_ONLY
|
||||||
#else
|
|
||||||
#error unknown objtype
|
|
||||||
#endif
|
#endif
|
||||||
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
|
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
|
||||||
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
|
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
|
||||||
|
|
|
@ -54,7 +54,6 @@ void ioinit(void);
|
||||||
int iounused(int, int);
|
int iounused(int, int);
|
||||||
int irqallocread(char*, long, vlong);
|
int irqallocread(char*, long, vlong);
|
||||||
int isaconfig(char*, int, ISAConf*);
|
int isaconfig(char*, int, ISAConf*);
|
||||||
void kbdinit(void);
|
|
||||||
#define kexit(a)
|
#define kexit(a)
|
||||||
#define kmapinval()
|
#define kmapinval()
|
||||||
void *kmapv(uvlong, int);
|
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();
|
printinit();
|
||||||
/* it's now safe to print */
|
/* it's now safe to print */
|
||||||
/* dumpopts(); /* DEBUG */
|
/* dumpopts(); /* DEBUG */
|
||||||
kbdinit();
|
|
||||||
i8250console();
|
i8250console();
|
||||||
quotefmtinstall();
|
quotefmtinstall();
|
||||||
print("\nPlan 9\n");
|
print("\nPlan 9\n");
|
||||||
|
|
|
@ -16,7 +16,6 @@ PORT=\
|
||||||
chan.$O\
|
chan.$O\
|
||||||
dev.$O\
|
dev.$O\
|
||||||
fault.$O\
|
fault.$O\
|
||||||
latin1.$O\
|
|
||||||
log.$O\
|
log.$O\
|
||||||
edf.$O\
|
edf.$O\
|
||||||
mul64fract.$O\
|
mul64fract.$O\
|
||||||
|
@ -46,7 +45,6 @@ OBJ=\
|
||||||
fdc37c93x.$O\
|
fdc37c93x.$O\
|
||||||
fptrap.$O\
|
fptrap.$O\
|
||||||
i8259.$O\
|
i8259.$O\
|
||||||
kbd.$O\
|
|
||||||
main.$O\
|
main.$O\
|
||||||
mmu.$O\
|
mmu.$O\
|
||||||
random.$O\
|
random.$O\
|
||||||
|
@ -78,6 +76,9 @@ $p$CONF: $CONF.c $OBJ $LIB
|
||||||
install:V: $p$CONF
|
install:V: $p$CONF
|
||||||
cp $p$CONF /$objtype/$p$CONF
|
cp $p$CONF /$objtype/$p$CONF
|
||||||
|
|
||||||
|
rootfs.bz2:
|
||||||
|
rc ../port/mkbootfs
|
||||||
|
|
||||||
<../boot/bootmkfile
|
<../boot/bootmkfile
|
||||||
<../port/portmkfile
|
<../port/portmkfile
|
||||||
<|../port/mkbootrules $CONF
|
<|../port/mkbootrules $CONF
|
||||||
|
@ -95,7 +96,6 @@ clock.$O: /$objtype/include/ureg.h axp.h
|
||||||
devarch.$O: axp.h
|
devarch.$O: axp.h
|
||||||
faultalpha.$O: /$objtype/include/ureg.h
|
faultalpha.$O: /$objtype/include/ureg.h
|
||||||
fptrap.$O: /$objtype/include/ureg.h
|
fptrap.$O: /$objtype/include/ureg.h
|
||||||
kbd.$O: /$objtype/include/ureg.h
|
|
||||||
l.$O: osf1pal.h
|
l.$O: osf1pal.h
|
||||||
main.$O: /$objtype/include/ureg.h errstr.h init.h
|
main.$O: /$objtype/include/ureg.h errstr.h init.h
|
||||||
mmu.$O: /sys/src/boot/alphapc/conf.h
|
mmu.$O: /sys/src/boot/alphapc/conf.h
|
||||||
|
|
|
@ -7,6 +7,7 @@ struct Cursorinfo {
|
||||||
|
|
||||||
/* devmouse.c */
|
/* devmouse.c */
|
||||||
extern void mousetrack(int, int, int, int);
|
extern void mousetrack(int, int, int, int);
|
||||||
|
extern void absmousetrack(int, int, int, int);
|
||||||
extern Point mousexy(void);
|
extern Point mousexy(void);
|
||||||
|
|
||||||
extern void mouseaccelerate(int);
|
extern void mouseaccelerate(int);
|
||||||
|
|
|
@ -12,7 +12,6 @@ enum{
|
||||||
Qbattery,
|
Qbattery,
|
||||||
Qbuttons,
|
Qbuttons,
|
||||||
Qcruft,
|
Qcruft,
|
||||||
Qkbdin,
|
|
||||||
Qled,
|
Qled,
|
||||||
Qversion,
|
Qversion,
|
||||||
Qpower,
|
Qpower,
|
||||||
|
@ -28,34 +27,12 @@ enum{
|
||||||
SOF= 0x2, /* start of frame */
|
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[]={
|
Dirtab µcdir[]={
|
||||||
".", { Qdir, 0, QTDIR }, 0, DMDIR|0755,
|
".", { Qdir, 0, QTDIR }, 0, DMDIR|0755,
|
||||||
"backlight", { Qbacklight, 0 }, 0, 0664,
|
"backlight", { Qbacklight, 0 }, 0, 0664,
|
||||||
"battery", { Qbattery, 0 }, 0, 0664,
|
"battery", { Qbattery, 0 }, 0, 0664,
|
||||||
"buttons", { Qbuttons, 0 }, 0, 0664,
|
"buttons", { Qbuttons, 0 }, 0, 0664,
|
||||||
"cruft", { Qcruft, 0 }, 0, 0664,
|
"cruft", { Qcruft, 0 }, 0, 0664,
|
||||||
"kbdin", { Qkbdin, 0 }, 0, 0664,
|
|
||||||
"led", { Qled, 0 }, 0, 0664,
|
"led", { Qled, 0 }, 0, 0664,
|
||||||
"version", { Qversion, 0 }, 0, 0664,
|
"version", { Qversion, 0 }, 0, 0664,
|
||||||
"power", { Qpower, 0 }, 0, 0600,
|
"power", { Qpower, 0 }, 0, 0600,
|
||||||
|
@ -82,13 +59,6 @@ static struct µcontroller
|
||||||
char version[16+2];
|
char version[16+2];
|
||||||
} ctlr;
|
} ctlr;
|
||||||
|
|
||||||
/* button map */
|
|
||||||
Rune bmap[2][4] =
|
|
||||||
{
|
|
||||||
{Kup, Kright, Kleft, Kdown}, /* portrait mode */
|
|
||||||
{Kright, Kdown, Kup, Kleft}, /* landscape mode */
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int landscape;
|
extern int landscape;
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -148,12 +118,8 @@ int
|
||||||
b = p[0] & 0x7f;
|
b = p[0] & 0x7f;
|
||||||
up = p[0] & 0x80;
|
up = p[0] & 0x80;
|
||||||
|
|
||||||
if(b > 5) {
|
if(b <= 5){
|
||||||
/* rocker panel acts like arrow keys */
|
/* like mouse buttons */
|
||||||
if(b < 10 && !up)
|
|
||||||
kbdputc(kbdq, bmap[landscape][b-6]);
|
|
||||||
} else {
|
|
||||||
/* the rest like mouse buttons */
|
|
||||||
if(--b == 0)
|
if(--b == 0)
|
||||||
b = 5;
|
b = 5;
|
||||||
penbutton(up, 1<<b);
|
penbutton(up, 1<<b);
|
||||||
|
@ -359,17 +325,6 @@ static long
|
||||||
extern ulong resumeaddr[];
|
extern ulong resumeaddr[];
|
||||||
extern void power_resume(void);
|
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(c->qid.path == Qpower){
|
||||||
if(!iseve())
|
if(!iseve())
|
||||||
error(Eperm);
|
error(Eperm);
|
||||||
|
|
|
@ -17,7 +17,6 @@ PORT=\
|
||||||
dev.$O\
|
dev.$O\
|
||||||
edf.$O\
|
edf.$O\
|
||||||
fault.$O\
|
fault.$O\
|
||||||
latin1.$O\
|
|
||||||
mul64fract.$O\
|
mul64fract.$O\
|
||||||
rebootcmd.$O\
|
rebootcmd.$O\
|
||||||
page.$O\
|
page.$O\
|
||||||
|
|
|
@ -21,7 +21,6 @@ PORT=\
|
||||||
dev.$O\
|
dev.$O\
|
||||||
edf.$O\
|
edf.$O\
|
||||||
fault.$O\
|
fault.$O\
|
||||||
latin1.$O\
|
|
||||||
mul64fract.$O\
|
mul64fract.$O\
|
||||||
rebootcmd.$O\
|
rebootcmd.$O\
|
||||||
page.$O\
|
page.$O\
|
||||||
|
|
|
@ -51,7 +51,6 @@ void iofree(int);
|
||||||
void ioinit(void);
|
void ioinit(void);
|
||||||
int iprint(char*, ...);
|
int iprint(char*, ...);
|
||||||
int isaconfig(char*, int, ISAConf*);
|
int isaconfig(char*, int, ISAConf*);
|
||||||
void kbdinit(void);
|
|
||||||
#define kexit(a)
|
#define kexit(a)
|
||||||
#define kmapinval()
|
#define kmapinval()
|
||||||
void links(void);
|
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();
|
mmuinit();
|
||||||
hwintrinit();
|
hwintrinit();
|
||||||
clockinit();
|
clockinit();
|
||||||
kbdinit();
|
|
||||||
procinit0();
|
procinit0();
|
||||||
initseg();
|
initseg();
|
||||||
timersinit();
|
timersinit();
|
||||||
|
|
|
@ -17,7 +17,6 @@ PORT=\
|
||||||
dev.$O\
|
dev.$O\
|
||||||
edf.$O\
|
edf.$O\
|
||||||
fault.$O\
|
fault.$O\
|
||||||
latin1.$O\
|
|
||||||
log.$O\
|
log.$O\
|
||||||
mul64fract.$O\
|
mul64fract.$O\
|
||||||
rebootcmd.$O\
|
rebootcmd.$O\
|
||||||
|
@ -43,7 +42,6 @@ OBJ=\
|
||||||
inb.$O\
|
inb.$O\
|
||||||
clock.$O\
|
clock.$O\
|
||||||
i8259.$O\
|
i8259.$O\
|
||||||
kbd.$O\
|
|
||||||
main.$O\
|
main.$O\
|
||||||
mmu.$O\
|
mmu.$O\
|
||||||
random.$O\
|
random.$O\
|
||||||
|
|
|
@ -1281,11 +1281,6 @@ archreboot(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
kbdinit(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
lastresortprint(char *buf, long bp)
|
lastresortprint(char *buf, long bp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,8 +25,6 @@ dev
|
||||||
|
|
||||||
draw screen
|
draw screen
|
||||||
dss
|
dss
|
||||||
kbmap
|
|
||||||
kbin
|
|
||||||
mouse
|
mouse
|
||||||
|
|
||||||
uart
|
uart
|
||||||
|
@ -73,10 +71,11 @@ port
|
||||||
|
|
||||||
boot cpu
|
boot cpu
|
||||||
tcp
|
tcp
|
||||||
|
local
|
||||||
|
|
||||||
bootdir
|
bootdir
|
||||||
boot$CONF.out boot
|
boot$CONF.out boot
|
||||||
/arm/bin/ip/ipconfig ipconfig
|
/arm/bin/bzfs
|
||||||
/arm/bin/auth/factotum factotum
|
/arm/bin/mntgen
|
||||||
/arm/bin/usb/usbd
|
/arm/bin/auth/factotum
|
||||||
nvram
|
rootfs.bz2
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -225,11 +225,8 @@ uartreset(void)
|
||||||
p->dev = i;
|
p->dev = i;
|
||||||
if(p->console || p->special){
|
if(p->console || p->special){
|
||||||
if(uartenable(p) != nil){
|
if(uartenable(p) != nil){
|
||||||
if(p->console && up){
|
if(p->console && up)
|
||||||
kbdq = p->iq;
|
|
||||||
serialoq = p->oq;
|
serialoq = p->oq;
|
||||||
p->putc = kbdcr2nl;
|
|
||||||
}
|
|
||||||
p->opens++;
|
p->opens++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,6 @@ extern void intrsoff(void);
|
||||||
extern int isaconfig(char*, int, ISAConf*);
|
extern int isaconfig(char*, int, ISAConf*);
|
||||||
extern int isdmadone(int);
|
extern int isdmadone(int);
|
||||||
extern int ispow2(uvlong);
|
extern int ispow2(uvlong);
|
||||||
extern void kbdenable(void);
|
|
||||||
extern void l2cacheuinv(void);
|
extern void l2cacheuinv(void);
|
||||||
extern void l2cacheuwb(void);
|
extern void l2cacheuwb(void);
|
||||||
extern void l2cacheuwbinv(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 */
|
delay(250); /* let uart catch up */
|
||||||
printinit();
|
printinit();
|
||||||
kbdenable();
|
// kbdenable();
|
||||||
|
|
||||||
cpuidprint();
|
cpuidprint();
|
||||||
// chkmissing();
|
// chkmissing();
|
||||||
|
@ -445,8 +445,6 @@ init0(void)
|
||||||
dmatest(); /* needs `up' set, so can't do it earlier */
|
dmatest(); /* needs `up' set, so can't do it earlier */
|
||||||
chandevinit();
|
chandevinit();
|
||||||
i8250console(); /* might be redundant, but harmless */
|
i8250console(); /* might be redundant, but harmless */
|
||||||
if(kbdq == nil)
|
|
||||||
panic("init0: nil kbdq");
|
|
||||||
if(serialoq == nil)
|
if(serialoq == nil)
|
||||||
panic("init0: nil serialoq");
|
panic("init0: nil serialoq");
|
||||||
normalprint = 1;
|
normalprint = 1;
|
||||||
|
|
|
@ -22,7 +22,6 @@ PORT=\
|
||||||
dev.$O\
|
dev.$O\
|
||||||
edf.$O\
|
edf.$O\
|
||||||
fault.$O\
|
fault.$O\
|
||||||
latin1.$O\
|
|
||||||
mul64fract.$O\
|
mul64fract.$O\
|
||||||
rebootcmd.$O\
|
rebootcmd.$O\
|
||||||
page.$O\
|
page.$O\
|
||||||
|
@ -50,7 +49,6 @@ OBJ=\
|
||||||
fpi.$O\
|
fpi.$O\
|
||||||
fpiarm.$O\
|
fpiarm.$O\
|
||||||
fpimem.$O\
|
fpimem.$O\
|
||||||
kbd.$O\
|
|
||||||
main.$O\
|
main.$O\
|
||||||
mmu.$O\
|
mmu.$O\
|
||||||
random.$O\
|
random.$O\
|
||||||
|
@ -94,6 +92,9 @@ install:V: /$objtype/$p$CONF
|
||||||
wait
|
wait
|
||||||
touch $target
|
touch $target
|
||||||
|
|
||||||
|
rootfs.bz2:
|
||||||
|
rc ../port/mkbootfs
|
||||||
|
|
||||||
<../boot/bootmkfile
|
<../boot/bootmkfile
|
||||||
<../port/portmkfile
|
<../port/portmkfile
|
||||||
<|../port/mkbootrules $CONF
|
<|../port/mkbootrules $CONF
|
||||||
|
|
|
@ -15,6 +15,7 @@ extern Cursorinfo cursor;
|
||||||
|
|
||||||
/* devmouse.c */
|
/* devmouse.c */
|
||||||
extern void mousetrack(int, int, int, int);
|
extern void mousetrack(int, int, int, int);
|
||||||
|
extern void absmousetrack(int, int, int, int);
|
||||||
extern Point mousexy(void);
|
extern Point mousexy(void);
|
||||||
|
|
||||||
extern void mouseaccelerate(int);
|
extern void mouseaccelerate(int);
|
||||||
|
|
|
@ -812,9 +812,7 @@ i8250console(void)
|
||||||
|
|
||||||
if(uartenable(uart) != nil /* && uart->console */){
|
if(uartenable(uart) != nil /* && uart->console */){
|
||||||
// iprint("i8250console: enabling console uart\n");
|
// iprint("i8250console: enabling console uart\n");
|
||||||
kbdq = uart->iq;
|
|
||||||
serialoq = uart->oq;
|
serialoq = uart->oq;
|
||||||
uart->putc = kbdcr2nl;
|
|
||||||
uart->opens++;
|
uart->opens++;
|
||||||
consuart = uart;
|
consuart = uart;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ PORT=\
|
||||||
dev.$O\
|
dev.$O\
|
||||||
edf.$O\
|
edf.$O\
|
||||||
fault.$O\
|
fault.$O\
|
||||||
latin1.$O\
|
|
||||||
page.$O\
|
page.$O\
|
||||||
parse.$O\
|
parse.$O\
|
||||||
pgrp.$O\
|
pgrp.$O\
|
||||||
|
|
|
@ -8,6 +8,8 @@ struct Audio
|
||||||
void *ctlr;
|
void *ctlr;
|
||||||
void *mixer;
|
void *mixer;
|
||||||
|
|
||||||
|
Ref audioopen;
|
||||||
|
|
||||||
long (*read)(Audio *, void *, long, vlong);
|
long (*read)(Audio *, void *, long, vlong);
|
||||||
long (*write)(Audio *, void *, long, vlong);
|
long (*write)(Audio *, void *, long, vlong);
|
||||||
void (*close)(Audio *);
|
void (*close)(Audio *);
|
||||||
|
|
|
@ -49,7 +49,7 @@ static Audioprobe audioprobes[16];
|
||||||
static Audio *audiodevs;
|
static Audio *audiodevs;
|
||||||
|
|
||||||
static char Evolume[] = "illegal volume specifier";
|
static char Evolume[] = "illegal volume specifier";
|
||||||
|
static char Ebusy[] = "device is busy";
|
||||||
|
|
||||||
void
|
void
|
||||||
addaudiocard(char *name, int (*probefn)(Audio *))
|
addaudiocard(char *name, int (*probefn)(Audio *))
|
||||||
|
@ -170,6 +170,15 @@ audioattach(char *spec)
|
||||||
static Chan*
|
static Chan*
|
||||||
audioopen(Chan *c, int omode)
|
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);
|
return devopen(c, omode, audiodir, nelem(audiodir), devgen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,9 +300,11 @@ audioclose(Chan *c)
|
||||||
|
|
||||||
ac = c->aux;
|
ac = c->aux;
|
||||||
adev = ac->adev;
|
adev = ac->adev;
|
||||||
if(c->qid.path == Qaudio && (c->flag & COPEN))
|
if(c->qid.path == Qaudio && (c->flag & COPEN)){
|
||||||
if(adev->close)
|
if(adev->close)
|
||||||
adev->close(adev);
|
adev->close(adev);
|
||||||
|
decref(&adev->audioopen);
|
||||||
|
}
|
||||||
|
|
||||||
if(ac->owner == c){
|
if(ac->owner == c){
|
||||||
ac->owner = nil;
|
ac->owner = nil;
|
||||||
|
|
|
@ -72,15 +72,12 @@ static Cmdtab mousectlmsg[] =
|
||||||
Mouseinfo mouse;
|
Mouseinfo mouse;
|
||||||
Cursorinfo cursor;
|
Cursorinfo cursor;
|
||||||
int mouseshifted;
|
int mouseshifted;
|
||||||
int kbdbuttons;
|
|
||||||
void (*kbdmouse)(int);
|
|
||||||
Cursor curs;
|
Cursor curs;
|
||||||
|
|
||||||
void Cursortocursor(Cursor*);
|
void Cursortocursor(Cursor*);
|
||||||
int mousechanged(void*);
|
int mousechanged(void*);
|
||||||
|
|
||||||
static void mouseclock(void);
|
static void mouseclock(void);
|
||||||
static void xkbdmouse(int);
|
|
||||||
|
|
||||||
enum{
|
enum{
|
||||||
Qdir,
|
Qdir,
|
||||||
|
@ -120,13 +117,6 @@ mousereset(void)
|
||||||
addclock0link(mouseclock, 33);
|
addclock0link(mouseclock, 33);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
mousefromkbd(int buttons)
|
|
||||||
{
|
|
||||||
kbdbuttons = buttons;
|
|
||||||
mousetrack(0, 0, 0, TK2MS(MACHP(0)->ticks));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mousedevgen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp)
|
mousedevgen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp)
|
||||||
{
|
{
|
||||||
|
@ -147,7 +137,6 @@ mouseinit(void)
|
||||||
curs = arrow;
|
curs = arrow;
|
||||||
Cursortocursor(&arrow);
|
Cursortocursor(&arrow);
|
||||||
cursoron(1);
|
cursoron(1);
|
||||||
kbdmouse = mousefromkbd;
|
|
||||||
mousetime = seconds();
|
mousetime = seconds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -603,7 +592,7 @@ mousetrack(int dx, int dy, int b, int msec)
|
||||||
|
|
||||||
lastb = mouse.buttons;
|
lastb = mouse.buttons;
|
||||||
mouse.xy = Pt(x, y);
|
mouse.xy = Pt(x, y);
|
||||||
mouse.buttons = b|kbdbuttons;
|
mouse.buttons = b;
|
||||||
mouse.redraw = 1;
|
mouse.redraw = 1;
|
||||||
mouse.counter++;
|
mouse.counter++;
|
||||||
mouse.msec = msec;
|
mouse.msec = msec;
|
||||||
|
@ -642,7 +631,7 @@ absmousetrack(int x, int y, int b, int msec)
|
||||||
|
|
||||||
lastb = mouse.buttons;
|
lastb = mouse.buttons;
|
||||||
mouse.xy = Pt(x, y);
|
mouse.xy = Pt(x, y);
|
||||||
mouse.buttons = b|kbdbuttons;
|
mouse.buttons = b;
|
||||||
mouse.redraw = 1;
|
mouse.redraw = 1;
|
||||||
mouse.counter++;
|
mouse.counter++;
|
||||||
mouse.msec = msec;
|
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* eve;
|
||||||
extern char hostdomain[];
|
extern char hostdomain[];
|
||||||
extern uchar initcode[];
|
extern uchar initcode[];
|
||||||
extern int kbdbuttons;
|
|
||||||
extern Queue* kbdq;
|
|
||||||
extern Queue* kprintoq;
|
extern Queue* kprintoq;
|
||||||
extern Ref noteidalloc;
|
extern Ref noteidalloc;
|
||||||
extern int nsyscall;
|
extern int nsyscall;
|
||||||
|
|
|
@ -150,7 +150,6 @@ void (*kproftimer)(ulong);
|
||||||
void ksetenv(char*, char*, int);
|
void ksetenv(char*, char*, int);
|
||||||
void kstrcpy(char*, char*, int);
|
void kstrcpy(char*, char*, int);
|
||||||
void kstrdup(char**, char*);
|
void kstrdup(char**, char*);
|
||||||
long latin1(Rune*, int);
|
|
||||||
int lock(Lock*);
|
int lock(Lock*);
|
||||||
void logopen(Log*);
|
void logopen(Log*);
|
||||||
void logclose(Log*);
|
void logclose(Log*);
|
||||||
|
|
|
@ -59,9 +59,6 @@ $CONF.c: ../port/mkdevc $CONF
|
||||||
errstr.h: ../port/mkerrstr ../port/error.h
|
errstr.h: ../port/mkerrstr ../port/error.h
|
||||||
rc ../port/mkerrstr > errstr.h
|
rc ../port/mkerrstr > errstr.h
|
||||||
|
|
||||||
../port/latin1.h: /lib/keyboard
|
|
||||||
aux/mklatinkbd /lib/keyboard > ../port/latin1.h
|
|
||||||
|
|
||||||
%.db: main.$O
|
%.db: main.$O
|
||||||
$CC -s$stem main.c | dbfmt > $stem.db
|
$CC -s$stem main.c | dbfmt > $stem.db
|
||||||
|
|
||||||
|
@ -69,6 +66,7 @@ alloc.$O: /sys/include/pool.h
|
||||||
devmnt.$O: /sys/include/fcall.h
|
devmnt.$O: /sys/include/fcall.h
|
||||||
proc.$O: errstr.h
|
proc.$O: errstr.h
|
||||||
devroot.$O: errstr.h
|
devroot.$O: errstr.h
|
||||||
|
devaudio.$O: ../port/audioif.h
|
||||||
devaoe.$O: /$objtype/include/ureg.h
|
devaoe.$O: /$objtype/include/ureg.h
|
||||||
devfs.$O: /$objtype/include/ureg.h
|
devfs.$O: /$objtype/include/ureg.h
|
||||||
devsd.$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
|
devmouse.$O: screen.h /sys/include/memdraw.h
|
||||||
devdraw.$O: screen.h /sys/include/memdraw.h
|
devdraw.$O: screen.h /sys/include/memdraw.h
|
||||||
screen.$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
|
thwack.$O: ../port/thwack.h
|
||||||
unthwack.$O: ../port/thwack.h
|
unthwack.$O: ../port/thwack.h
|
||||||
devsdp.$O: ../port/thwack.h
|
devsdp.$O: ../port/thwack.h
|
||||||
|
|
|
@ -19,7 +19,6 @@ PORT=\
|
||||||
dev.$O\
|
dev.$O\
|
||||||
edf.$O\
|
edf.$O\
|
||||||
fault.$O\
|
fault.$O\
|
||||||
latin1.$O\
|
|
||||||
log.$O\
|
log.$O\
|
||||||
rebootcmd.$O\
|
rebootcmd.$O\
|
||||||
page.$O\
|
page.$O\
|
||||||
|
|
|
@ -156,9 +156,13 @@ static PY_LONG_LONG CallExternalTimer(ProfilerObject *pObj)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CALL_TIMER(pObj) ((pObj)->externalTimer ? \
|
static PY_LONG_LONG
|
||||||
CallExternalTimer(pObj) : \
|
CALL_TIMER(ProfilerObject *pObj)
|
||||||
hpTimer())
|
{
|
||||||
|
if(pObj->externalTimer)
|
||||||
|
return CallExternalTimer(pObj);
|
||||||
|
return hpTimer();
|
||||||
|
}
|
||||||
|
|
||||||
/*** ProfilerObject ***/
|
/*** ProfilerObject ***/
|
||||||
|
|
||||||
|
|
|
@ -1007,8 +1007,10 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args)
|
||||||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||||
offset = PyInt_AsLong(offobj);
|
offset = PyInt_AsLong(offobj);
|
||||||
#else
|
#else
|
||||||
offset = PyLong_Check(offobj) ?
|
if(PyLong_Check(offobj))
|
||||||
PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
|
offset = PyLong_AsLongLong(offobj);
|
||||||
|
else
|
||||||
|
offset = PyInt_AsLong(offobj);
|
||||||
#endif
|
#endif
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -339,9 +339,10 @@ fcntl_lockf(PyObject *self, PyObject *args)
|
||||||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||||
l.l_start = PyInt_AsLong(startobj);
|
l.l_start = PyInt_AsLong(startobj);
|
||||||
#else
|
#else
|
||||||
l.l_start = PyLong_Check(startobj) ?
|
if(PyLong_Check(startobj))
|
||||||
PyLong_AsLongLong(startobj) :
|
l.l_start = PyLong_AsLongLong(startobj);
|
||||||
PyInt_AsLong(startobj);
|
else
|
||||||
|
l.l_start = PyInt_AsLong(startobj);
|
||||||
#endif
|
#endif
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -350,9 +351,10 @@ fcntl_lockf(PyObject *self, PyObject *args)
|
||||||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||||
l.l_len = PyInt_AsLong(lenobj);
|
l.l_len = PyInt_AsLong(lenobj);
|
||||||
#else
|
#else
|
||||||
l.l_len = PyLong_Check(lenobj) ?
|
if(PyLong_Check(lenobj))
|
||||||
PyLong_AsLongLong(lenobj) :
|
l.l_len = PyLong_AsLongLong(lenobj);
|
||||||
PyInt_AsLong(lenobj);
|
else
|
||||||
|
l.l_len = PyInt_AsLong(lenobj);
|
||||||
#endif
|
#endif
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -6053,8 +6053,10 @@ posix_lseek(PyObject *self, PyObject *args)
|
||||||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||||
pos = PyInt_AsLong(posobj);
|
pos = PyInt_AsLong(posobj);
|
||||||
#else
|
#else
|
||||||
pos = PyLong_Check(posobj) ?
|
if(PyLong_Check(posobj))
|
||||||
PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
|
pos = PyLong_AsLongLong(posobj);
|
||||||
|
else
|
||||||
|
pos = PyInt_AsLong(posobj);
|
||||||
#endif
|
#endif
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -6384,8 +6386,10 @@ posix_ftruncate(PyObject *self, PyObject *args)
|
||||||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||||
length = PyInt_AsLong(lenobj);
|
length = PyInt_AsLong(lenobj);
|
||||||
#else
|
#else
|
||||||
length = PyLong_Check(lenobj) ?
|
if(PyLong_Check(lenobj))
|
||||||
PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
|
length = PyLong_AsLongLong(lenobj);
|
||||||
|
else
|
||||||
|
length = PyInt_AsLong(lenobj);
|
||||||
#endif
|
#endif
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -25,16 +25,19 @@ TESTNAME(PyObject *error(const char*))
|
||||||
base = 1;
|
base = 1;
|
||||||
for (i = 0;
|
for (i = 0;
|
||||||
i < NBITS + 1; /* on last, base overflows to 0 */
|
i < NBITS + 1; /* on last, base overflows to 0 */
|
||||||
++i, base <<= 1)
|
++i)
|
||||||
{
|
{
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
for (j = 0; j < 6; ++j) {
|
for (j = 0; j < 6; ++j) {
|
||||||
TYPENAME in, out;
|
TYPENAME in, out;
|
||||||
unsigned TYPENAME uin, uout;
|
unsigned TYPENAME uin, uout;
|
||||||
|
|
||||||
/* For 0, 1, 2 use base; for 3, 4, 5 use -base */
|
/* For 0, 1, 2 use base; for 3, 4, 5 use -base */
|
||||||
uin = j < 3 ? base
|
if(j < 3)
|
||||||
: (unsigned TYPENAME)(-(TYPENAME)base);
|
uin = base;
|
||||||
|
else
|
||||||
|
uin = (unsigned TYPENAME)(-(TYPENAME)base);
|
||||||
|
|
||||||
/* For 0 & 3, subtract 1.
|
/* For 0 & 3, subtract 1.
|
||||||
* For 1 & 4, leave alone.
|
* For 1 & 4, leave alone.
|
||||||
|
@ -71,6 +74,8 @@ TESTNAME(PyObject *error(const char*))
|
||||||
"signed output != input");
|
"signed output != input");
|
||||||
UNBIND(pyresult);
|
UNBIND(pyresult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
base <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Overflow tests. The loop above ensured that all limit cases that
|
/* 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)
|
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||||
offset = PyInt_AsLong(offobj);
|
offset = PyInt_AsLong(offobj);
|
||||||
#else
|
#else
|
||||||
offset = PyLong_Check(offobj) ?
|
if(PyLong_Check(offobj))
|
||||||
PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
|
offset = PyLong_AsLongLong(offobj);
|
||||||
|
else
|
||||||
|
offset = PyInt_AsLong(offobj);
|
||||||
#endif
|
#endif
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -610,9 +612,10 @@ file_truncate(PyFileObject *f, PyObject *args)
|
||||||
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
#if !defined(HAVE_LARGEFILE_SUPPORT)
|
||||||
newsize = PyInt_AsLong(newsizeobj);
|
newsize = PyInt_AsLong(newsizeobj);
|
||||||
#else
|
#else
|
||||||
newsize = PyLong_Check(newsizeobj) ?
|
if(PyLong_Check(newsizeobj))
|
||||||
PyLong_AsLongLong(newsizeobj) :
|
newsize = PyLong_AsLongLong(newsizeobj);
|
||||||
PyInt_AsLong(newsizeobj);
|
else
|
||||||
|
newsize = PyInt_AsLong(newsizeobj);
|
||||||
#endif
|
#endif
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -971,7 +971,7 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp)
|
||||||
if (filesize <= SMALL_FILE_LIMIT)
|
if (filesize <= SMALL_FILE_LIMIT)
|
||||||
pBuf = buf;
|
pBuf = buf;
|
||||||
else if (filesize <= REASONABLE_FILE_LIMIT)
|
else if (filesize <= REASONABLE_FILE_LIMIT)
|
||||||
pBuf = (char *)PyMem_MALLOC(filesize);
|
pBuf = (char *)PyMem_MALLOC((int)filesize);
|
||||||
if (pBuf != NULL) {
|
if (pBuf != NULL) {
|
||||||
PyObject* v;
|
PyObject* v;
|
||||||
size_t n;
|
size_t n;
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
#if defined(T386)
|
#if defined(T386)
|
||||||
#define FPINVAL (1<<0)
|
#define FPINVAL (1<<0)
|
||||||
|
#elif defined(Tarm)
|
||||||
|
#define FPINVAL (1<<16)
|
||||||
#else
|
#else
|
||||||
Error define FPINVAL for your arch. grep /$cputype/include/u.h
|
Error define FPINVAL for your arch. grep /$cputype/include/u.h
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue