M port/devnonet.c => port/devnonet.c +2 -2
@@ 1457,10 1457,10 @@ loop:
*/
if(cp->first!=cp->next && NOW>=cp->out[cp->first].time){
mp = &(cp->out[cp->first]);
- if(cp->rexmit++ > 15){
+/* if(cp->rexmit++ > 15){
norack(cp, mp->mid);
noreset(cp);
- } else
+ } else /**/
nosend(cp, mp);
}
M port/devscc.c => port/devscc.c +8 -11
@@ 197,26 197,28 @@ sccbreak(SCC *sp, int ms)
}
/*
- * 9600 baud, 1 stop bit, 8 bit chars, no interrupts,
+ * default is 9600 baud, 1 stop bit, 8 bit chars, no interrupts,
* transmit and receive enabled, interrupts disabled.
*/
void
-sccsetup(void)
+sccsetup(void *addr)
{
+ SCCdev *dev;
SCC *sp;
static int already;
if(already)
return;
already = 1;
+ dev = addr;
/*
* get port addresses
*/
- scc[0].ptr = &SCCADDR->ptra;
- scc[0].data = &SCCADDR->dataa;
- scc[1].ptr = &SCCADDR->ptrb;
- scc[1].data = &SCCADDR->datab;
+ scc[0].ptr = &dev->ptra;
+ scc[0].data = &dev->dataa;
+ scc[1].ptr = &dev->ptrb;
+ scc[1].data = &dev->datab;
for(sp = scc; sp < &scc[2]; sp++){
memset(sp->sticky, 0, sizeof(sp->sticky));
@@ 332,11 334,6 @@ void
sccdevice(SCC *sp)
{
/*
- * turn on both ports
- */
- sccsetup();
-
- /*
* set up i/o routines
*/
if(sp->oq){
M port/devwren.c => port/devwren.c +2 -0
@@ 235,6 235,7 @@ wrenread(Chan *c, char *a, long n, ulong offset)
n = cmd->data.ptr - cmd->data.base;
memmove(a, cmd->data.base, n);
qunlock(cmd);
+ poperror();
break;
case Qstruct:
if (n < 2*sizeof(ulong))
@@ 286,6 287,7 @@ wrenwrite(Chan *c, char *a, long n, ulong offset)
scsiexec(cmd, 0);
n = cmd->data.ptr - cmd->data.base;
qunlock(cmd);
+ poperror();
break;
default:
panic("wrenwrite");
M port/portfns.h => port/portfns.h +6 -0
@@ 8,6 8,7 @@ int anyready(void);
void append(List**, List*);
int blen(Block *);
int bround(Block *, int);
+void buzz(int, int);
void cancel(Alarm*);
int canlock(Lock*);
int canqlock(QLock*);
@@ 74,6 75,7 @@ void insert(List**, List*, List*);
void invalidateu(void);
void isdir(Chan*);
void kproc(char*, void(*)(void*), void*);
+void lights(int);
void lock(Lock*);
void lockinit(void);
Orig* lookorig(ulong, ulong, int, Chan*);
@@ 126,6 128,10 @@ void resched(char*);
int return0(void*);
Proc* runproc(void);
void savefpregs(FPsave*);
+void sccintr(void);
+void sccputs(IOQ*, char*, int);
+void sccsetup(void*);
+void sccspecial(int, IOQ*, IOQ*, int);
void schedinit(void);
void sched(void);
long seconds(void);
M port/queue.c => port/queue.c +2 -0
@@ 9,9 9,11 @@
void
initq(IOQ *q)
{
+ lock(q);
q->in = q->out = q->buf;
q->puts = puts;
q->putc = putc;
+ unlock(q);
}
int
M ss/dat.h => ss/dat.h +41 -0
@@ 1,6 1,8 @@
typedef struct Conf Conf;
typedef struct FFrame FFrame;
typedef struct FPsave FPsave;
+typedef struct IOQ IOQ;
+typedef struct KIOQ KIOQ;
typedef struct KMap KMap;
typedef struct Lance Lance;
typedef struct Lancemem Lancemem;
@@ 107,6 109,38 @@ struct PMMU
#include "../port/portdat.h"
/*
+ * character based IO (mouse, keyboard, console screen)
+ */
+#define NQ 4096
+struct IOQ
+{
+ Lock;
+ uchar buf[NQ];
+ uchar *in;
+ uchar *out;
+ int state;
+ Rendez r;
+ union{
+ void (*puts)(IOQ*, void*, int); /* output */
+ int (*putc)(IOQ*, int); /* input */
+ };
+ void *ptr;
+};
+struct KIOQ
+{
+ QLock;
+ IOQ;
+ int repeat;
+ int c;
+ int count;
+};
+
+extern IOQ lineq;
+extern IOQ printq;
+extern IOQ mouseq;
+extern KIOQ kbdq;
+
+/*
* machine dependent definitions not used by ../port/dat.h
*/
struct KMap
@@ 205,3 239,10 @@ extern register Mach *m; /* R6 */
extern register User *u; /* R5 */
extern uchar *intrreg;
+
+struct
+{
+ Lock;
+ short machs;
+ short exiting;
+}active;
M ss/fns.h => ss/fns.h +11 -2
@@ 1,6 1,8 @@
#include "../port/portfns.h"
void cacheinit(void);
+int cangetc(void*);
+int canputc(void*);
void clearfpintr(void);
#define clearmmucache()
void clockinit(void);
@@ 25,11 27,16 @@ void fpregrestore(char*);
void fpregsave(char*);
void fprestore(FPsave*);
void fpsave(FPsave*);
+int getc(IOQ*);
+int gets(IOQ*, void*, int);
int getb2(ulong);
int getrs232o(void);
int getw2(ulong);
+void initq(IOQ*);
void intrinit(void);
-void kbdchar(int);
+void ioinit(void);
+int kbdputc(IOQ*, int);
+int kbdstate(IOQ*, int);
void kbdclock(void);
void kbdrepeat(int);
KMap* kmap(Page*);
@@ 42,12 49,14 @@ void lancesetup(Lance*);
void lancetoggle(void);
void mmuinit(void);
void mousebuttons(int);
-void mousechar(int);
+int mouseputc(IOQ*, int);
void mouseclock(void);
void printinit(void);
#define procrestore(x,y)
#define procsave(x,y)
#define procsetup(x) ((p)->fpstate = FPinit)
+int putc(IOQ*, int);
+void puts(IOQ*, void*, int);
void putb2(ulong, int);
void putcontext(int);
void putcxreg(int);
M ss/io.h => ss/io.h +18 -2
@@ 1,5 1,3 @@
-typedef struct Duart Duart;
-
#define DISPLAYRAM 0x1E800000
#define EPROM 0xF6000000
#define CLOCK 0xF3000000
@@ 8,3 6,21 @@ typedef struct Duart Duart;
#define ETHER 0xF8C00000 /* RDP, RAP */
#define EEPROM 0xF2000000
#define INTRREG 0xF5000000 /* interrupt register, IO space */
+
+typedef struct SCCdev SCCdev;
+struct SCCdev
+{
+ uchar ptrb;
+ uchar dummy1;
+ uchar datab;
+ uchar dummy2;
+ uchar ptra;
+ uchar dummy3;
+ uchar dataa;
+ uchar dummy4;
+};
+
+/*
+ * crystal frequency for SCC
+ */
+#define SCCFREQ 10000000
M ss/main.c => ss/main.c +20 -0
@@ 25,10 25,12 @@ main(void)
machinit();
confinit();
mmuinit();
+ screeninit();
printinit();
print("sparc plan 9\n");
trapinit();
kmapinit();
+ ioinit();
cacheinit();
intrinit();
procinit0();
@@ 75,6 77,18 @@ machinit(void)
}
void
+ioinit(void)
+{
+ KMap *k;
+
+ k = kmappa(KMDUART, PTEIO|PTENOCACHE);
+ sccsetup((void*)(k->va));
+ sccspecial(0, 0, &kbdq, 2400); /* scc port 0 is the keyboard */
+ kbdq.putc = kbdstate;
+ sccspecial(1, 0, &mouseq, 2400); /* scc port 1 is the mouse */
+}
+
+void
init0(void)
{
Chan *c;
@@ 343,3 357,9 @@ print("%d lance buffers\n", i);
lp->ltp = lp->lrp+lp->nrrb;
lp->tp = lp->rp+lp->nrrb;
}
+
+void
+firmware(void)
+{
+ reset();
+}
M ss/screen.c => ss/screen.c +17 -220
@@ 20,11 20,7 @@ struct{
int bwid;
}out;
-int duartacr;
-int duartimr;
-
void (*kprofp)(ulong);
-void kbdstate(int);
GBitmap gscreen =
{
@@ 78,220 74,11 @@ screenputc(int c)
}
}
-/*
- * Driver for the Z8530.
- */
-enum
-{
- /* wr 0 */
- ResExtPend= 2<<3,
- ResTxPend= 5<<3,
- ResErr= 6<<3,
-
- /* wr 1 */
- TxIntEna= 1<<1,
- RxIntDis= 0<<3,
- RxIntFirstEna= 1<<3,
- RxIntAllEna= 2<<3,
-
- /* wr 3 */
- RxEna= 1,
- Rx5bits= 0<<6,
- Rx7bits= 1<<6,
- Rx6bits= 2<<6,
- Rx8bits= 3<<6,
-
- /* wr 4 */
- SyncMode= 0<<2,
- Rx1stop= 1<<2,
- Rx1hstop= 2<<2,
- Rx2stop= 3<<2,
- X16= 1<<6,
-
- /* wr 5 */
- TxRTS= 1<<1,
- TxEna= 1<<3,
- TxBreak= 1<<4,
- TxDTR= 1<<7,
- Tx5bits= 0<<5,
- Tx7bits= 1<<5,
- Tx6bits= 2<<5,
- Tx8bits= 3<<5,
-
- /* wr 9 */
- IntEna= 1<<3,
- ResetB= 1<<6,
- ResetA= 2<<6,
- HardReset= 3<<6,
-
- /* wr 11 */
- TRxCOutBR= 2,
- TxClockBR= 2<<3,
- RxClockBR= 2<<5,
- TRxCOI= 1<<2,
-
- /* wr 14 */
- BREna= 1,
- BRSource= 2,
-
- /* rr 0 */
- RxReady= 1,
- TxReady= 1<<2,
- RxDCD= 1<<3,
- RxCTS= 1<<5,
- RxBreak= 1<<7,
-
- /* rr 3 */
- ExtPendB= 1,
- TxPendB= 1<<1,
- RxPendB= 1<<2,
- ExtPendA= 1<<3,
- TxPendA= 1<<4,
- RxPendA= 1<<5,
-};
-
-typedef struct Z8530 Z8530;
-struct Z8530
-{
- uchar ptrb;
- uchar dummy1;
- uchar datab;
- uchar dummy2;
- uchar ptra;
- uchar dummy3;
- uchar dataa;
- uchar dummy4;
-};
-
-#define NDELIM 5
-typedef struct Duart Duart;
-struct Duart
-{
- QLock;
- ushort sticky[16]; /* sticky write register values */
- uchar *ptr; /* command/pointer register in Z8530 */
- uchar *data; /* data register in Z8530 */
-};
-Duart duart[2];
-
-#define PRINTING 0x4
-#define MASK 0x1
-
-/*
- * Access registers using the pointer in register 0.
- */
void
-duartwrreg(Duart *dp, int addr, int value)
-{
- *dp->ptr = addr;
- *dp->ptr = dp->sticky[addr] | value;
-}
-
-ushort
-duartrdreg(Duart *dp, int addr)
+screenputs(char *s, int n)
{
- *dp->ptr = addr;
- return *dp->ptr;
-}
-
-/*
- * set the baud rate by calculating and setting the baudrate
- * generator constant. This will work with fairly non-standard
- * baud rates.
- */
-void
-duartsetbaud(Duart *dp, int rate)
-{
- int brconst;
-
- brconst = 10000000/(16*2*rate) - 2;
- duartwrreg(dp, 12, brconst & 0xff);
- duartwrreg(dp, 13, (brconst>>8) & 0xff);
-}
-
-/*
- * Initialize just keyboard and mouse for now
- */
-void
-duartinit(void)
-{
- Duart *dp;
- Z8530 *zp;
- KMap *k;
-
- k = kmappa(KMDUART, PTEIO|PTENOCACHE);
- zp = (Z8530*)k->va;
-
- /*
- * get port addresses
- */
- duart[0].ptr = &zp->ptra;
- duart[0].data = &zp->dataa;
- duart[1].ptr = &zp->ptrb;
- duart[1].data = &zp->datab;
-
- for(dp=duart; dp < &duart[2]; dp++){
- memset(dp->sticky, 0, sizeof(dp->sticky));
-
- /*
- * enable I/O, 8 bits/character
- */
- dp->sticky[3] = RxEna | Rx8bits;
- duartwrreg(dp, 3, 0);
- dp->sticky[5] = TxEna | Tx8bits;
- duartwrreg(dp, 5, 0);
-
- /*
- * turn on interrupts
- */
- dp->sticky[1] |= TxIntEna | RxIntAllEna;
- duartwrreg(dp, 1, 0);
- dp->sticky[9] |= IntEna;
- duartwrreg(dp, 9, 0);
- }
-
- /*
- * turn on DTR and RTS
- */
- dp = &duart[1];
- dp->sticky[5] |= TxRTS | TxDTR;
- duartwrreg(dp, 5, 0);
-}
-
-void
-duartintr(void)
-{
- char ch;
- int cause;
- Duart *dp;
-
- cause = duartrdreg(&duart[0], 3);
-
- /*
- * Keyboard
- */
- dp = &duart[0];
- if(cause & ExtPendA)
- duartwrreg(dp, 0, ResExtPend);
- if(cause & RxPendA){
- ch = *dp->data;
- kbdstate(ch);
- }
- if(cause & TxPendA)
- duartwrreg(dp, 0, ResTxPend);
- /*
- * Mouse
- */
- dp = &duart[1];
- if(cause & ExtPendB)
- duartwrreg(dp, 0, ResExtPend);
- if(cause & RxPendB){
- ch = *dp->data;
- mousechar(ch);
- }
- if(cause & TxPendB)
- duartwrreg(dp, 0, ResTxPend);
- cause = duartrdreg(&duart[0], 3);
+ while(n-- > 0)
+ screenputc(*s++);
}
/*
@@ 589,8 376,8 @@ latin1(int k1, int k2)
return 0;
}
-void
-kbdstate(int c)
+int
+kbdstate(IOQ *q, int c)
{
static shift = 0x00;
static caps = 0;
@@ 664,13 451,23 @@ kbdstate(int c)
k2 = tc;
tc = latin1(k1, k2);
if(c == 0){
- kbdchar(k1);
+ kbdputc(&kbdq, k1);
tc = k2;
}
/* fall through */
default:
kbdstate = 0;
- kbdchar(tc);
+ kbdputc(&kbdq, tc);
}
}
}
+
+void
+buzz(int freq, int dur)
+{
+}
+
+void
+lights(int mask)
+{
+}
M ss/trap.c => ss/trap.c +1 -1
@@ 77,7 77,7 @@ trap(Ureg *ur)
clock(ur);
break;
case 12: /* keyboard and mouse */
- duartintr();
+ sccintr();
break;
case 5: /* lance */
lanceintr();