M alphapc/dat.h => alphapc/dat.h +2 -0
@@ 15,6 15,8 @@ typedef struct Sys Sys;
typedef struct Ureg Ureg;
typedef struct Vctl Vctl;
+#define MAXSYSARG 6 /* for mount(fd, mpt, flag, arg, srv) */
+
/*
* parameters for sysproc.c
*/
M alphapc/main.c => alphapc/main.c +1 -1
@@ 189,7 189,7 @@ userinit(void)
* Kernel Stack
*/
p->sched.pc = (ulong)init0;
- p->sched.sp = (ulong)p->kstack+KSTACK-(1+MAXSYSARG)*BY2WD;
+ p->sched.sp = (ulong)p->kstack+KSTACK-MAXSYSARG*BY2WD;
/*
* User Stack, pass input arguments to boot process
*/
M bitsy/dat.h => bitsy/dat.h +2 -0
@@ 24,6 24,8 @@ typedef struct Uart Uart;
typedef void IntrHandler(Ureg*, void*);
+#define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */
+
/*
* parameters for sysproc.c
*/
M bitsy/power.c => bitsy/power.c +13 -17
@@ 88,8 88,7 @@ sa1100_power_off(void)
powerregs->pcfr = PCFR_opde | PCFR_fp | PCFR_fs;
powerregs->pgsr = 0;
/* set resume address. The loader jumps to it */
-// powerregs->pspr = (ulong)sa1100_power_resume;
- powerregs->pspr = (ulong)_start;
+ powerregs->pspr = (ulong)sa1100_power_resume;
/* set lowest clock; delay to avoid resume hangs on fast sa1110 */
delay(90);
@@ 128,10 127,10 @@ deepsleep(void) {
void *xsp, *xlink;
power_pl = splhi();
- xsp = getsp();
- xlink = getlink();
- iprint("starting power down, sp = %lux, link = %lux\n", xsp, xlink);
- delay(1000);
+xsp = getsp();
+xlink = getlink();
+iprint("starting power down, sp = %lux, link = %lux\n", xsp, xlink);
+delay(1000);
cachewb();
delay(500);
if (setpowerlabel()) {
@@ 157,10 156,10 @@ deepsleep(void) {
iprint("\nresuming execution\n");
// dumpitall();
delay(800);
- delay(1000);
- xsp = getsp();
- xlink = getlink();
- iprint("power restored, sp = %lux, link = %lux\n", xsp, xlink);
+xsp = getsp();
+xlink = getlink();
+iprint("power restored, sp = %lux, link = %lux\n", xsp, xlink);
+delay(1000);
splx(power_pl);
return;
@@ 174,9 173,9 @@ deepsleep(void) {
clockpower(0);
irpower(0);
audiopower(0);
-// screenpower(0);
+ screenpower(0);
µcpower(0);
-// rs232power(0);
+ rs232power(0);
sa1100_power_off();
/* no return */
}
@@ 189,13 188,11 @@ powerkproc(void*)
while(powerflag == 0)
sleep(&powerr, powerdown, 0);
-
deepsleep();
delay(2000);
powerflag = 0;
-
}
}
@@ 217,9 214,8 @@ onoffintr(Ureg* , void*)
return; /* bounced */
}
- deepsleep();
-// powerflag = 1;
-// wakeup(&powerr);
+ powerflag = 1;
+ wakeup(&powerr);
}
void
M pc/dat.h => pc/dat.h +2 -0
@@ 17,6 17,8 @@ typedef struct Segdesc Segdesc;
typedef struct Ureg Ureg;
typedef struct Vctl Vctl;
+#define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */
+
/*
* parameters for sysproc.c
*/
M pc/devi82365.c => pc/devi82365.c +4 -12
@@ 7,15 7,7 @@
#include "io.h"
/*
- * Support for up to 4 PCMslot card slots. Generalizing above that is hard
- * since addressing is not obvious. - presotto
- *
- * WARNING: This has never been tried with more than one card slot.
- */
-
-/*
- * Intel 82365SL PCIC controller for the PCMCIA or
- * Cirrus Logic PD6710/PD6720 which is mostly register compatible
+ * Intel 82365SL PCIC controller and compatibles.
*/
enum
{
@@ 159,6 151,7 @@ slotinfo(PCMslot *pp)
pp->wrprot = isr & (1<<4);
pp->busy = isr & (1<<5);
pp->msec = TK2MS(MACHP(0)->ticks);
+print("isr %2.2uX misc1 %2.2uX\n", isr, rdreg(pp, Rmisc1));
}
static int
@@ 467,8 460,8 @@ pcmgen(Chan *c, char*, Dirtab *, int , int i, Dir *dp)
static char *chipname[] =
{
[Ti82365] "Intel 82365SL",
-[Tpd6710] "Cirrus Logic PD6710",
-[Tpd6720] "Cirrus Logic PD6720",
+[Tpd6710] "Cirrus Logic CL-PD6710",
+[Tpd6720] "Cirrus Logic CL-PD6720",
[Tvg46x] "Vadem VG-46x",
};
@@ 609,7 602,6 @@ i82365reset(void)
nslot += controller[i]->nslot;
slot = xalloc(nslot * sizeof(PCMslot));
- /* if the card is there turn on 5V power to keep its battery alive */
lastslot = slot;
for(i = 0; i < ncontroller; i++){
cp = controller[i];
M port/devpnp.c => port/devpnp.c +64 -20
@@ 21,6 21,7 @@ struct Card
int csn;
ulong id1;
ulong id2;
+ char *cfgstr;
int ncfg;
Card* next;
};
@@ 62,6 63,7 @@ static Dirtab pnpdir[] = {
};
extern Dev pnpdevtab;
+static int wrconfig(Card*, char*);
static char key[32] =
{
@@ 230,7 232,7 @@ pnpncfg(int rddata)
/* look for cards, and assign them CSNs */
static int
-pnpscan(int rddata)
+pnpscan(int rddata, int dawn)
{
Card *c;
int csn, ok;
@@ 238,7 240,7 @@ pnpscan(int rddata)
ilock(&pnp);
pnp.rddata = rddata;
- initiation();
+ initiation(); /* upsilon sigma */
cmd(0x02, 0x04+0x01); /* reset CSN on all cards and reset logical devices */
delay(1); /* delay after resetting cards */
@@ 254,8 256,14 @@ pnpscan(int rddata)
c->id1 = id1;
c->id2 = id2;
}
+ else if(c->cfgstr != nil) {
+ if(!wrconfig(c, c->cfgstr))
+ print("pnp%d: bad cfg: %s\n", c->csn, c->cfgstr);
+ c->cfgstr = nil;
+ }
cmd(0x06, c->csn); /* set the card's csn */
- print("pnp%d: %s\n", c->csn, serial(id1, id2));
+ if(dawn)
+ print("pnp%d: %s\n", c->csn, serial(id1, id2));
c->ncfg = pnpncfg(rddata);
cmd(0x03, 0); /* Wake all cards with a CSN of 0, putting this card to sleep */
}
@@ 296,13 304,18 @@ bad:
x = strtoul(&s[3], 0, 16);
id1 = (i1<<2)|((i2>>3)&3)|((i2&7)<<13)|(i3<<8)|((x&0xff)<<24)|((x&0xff00)<<8);
id2 = strtoul(&s[8], &p, 16);
- if(*p != ' ' && *p != '\0')
+ if(*p == ' ')
+ p++;
+ else if(*p == '\0')
+ p = nil;
+ else
goto bad;
c = findcsn(csn, 1);
c->id1 = id1;
c->id2 = id2;
+ c->cfgstr = p;
}
- pnpscan(isa.port);
+ pnpscan(isa.port, 1);
}
static int
@@ 334,7 347,6 @@ pnpgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp)
Card *cp;
char name[KNAMELEN];
-DPRINT("pnpgen s %d offset %uld qid %lux\n", s, (ulong)c->offset, (ulong)c->qid.path);
switch(TYPE(c->qid)){
case Qtopdir:
if(s == DEVDOTDOT){
@@ 351,11 363,9 @@ DPRINT("pnpgen s %d offset %uld qid %lux\n", s, (ulong)c->offset, (ulong)c->qid.
devdir(c, q, name, 0, eve, 0555, dp);
return 1;
}
-DPRINT("Qpnpdir s %d\n", s);
- if(s < nelem(pnpdir))
+ if(s < nelem(pnpdir)-1)
return devgen(c, nil, pnpdir, nelem(pnpdir), s, dp);
- s -= nelem(pnpdir);
-DPRINT("Qpnpdir s now %d\n", s);
+ s -= nelem(pnpdir)-1;
ilock(&pnp);
cp = pnp.cards;
while(s >= 2 && cp != nil) {
@@ 363,7 373,6 @@ DPRINT("Qpnpdir s now %d\n", s);
cp = cp->next;
}
iunlock(&pnp);
-DPRINT("Qpnpdir s now %d, cp %p\n", s, cp);
if(cp == nil)
return -1;
return pnpgen1(c, s+Qcsnctl, cp->csn, cp, dp);
@@ 472,22 481,25 @@ pnpread(Chan *c, void *va, long n, vlong offset)
}
static long
-pnpwrite(Chan *c, void *a, long n, vlong offset)
+pnpwrite(Chan *c, void *a, long n, vlong)
{
+ int csn;
+ Card *cp;
ulong port;
char buf[256];
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, a, n);
+ buf[n] = 0;
+
switch(TYPE(c->qid)){
case Qpnpctl:
- if(n >= sizeof(buf))
- n = sizeof(buf)-1;
- strncpy(buf, a, n);
- buf[n] = 0;
- if(strncmp(buf, "rddata ", 7) == 0) {
- port = strtoul(buf+7, 0, 0);
+ if(strncmp(buf, "port ", 5) == 0) {
+ port = strtoul(buf+5, 0, 0);
if(port < 0x203 || port > 0x3ff)
error("bad value for rddata port");
- if(!pnpscan(port))
+ if(!pnpscan(port, 0))
error("no cards found");
}
else if(strncmp(buf, "debug ", 6) == 0)
@@ 495,13 507,45 @@ pnpwrite(Chan *c, void *a, long n, vlong offset)
else
error(Ebadctl);
break;
+ case Qcsnctl:
+ csn = CSN(c->qid);
+ ilock(&pnp);
+ cp = findcsn(csn, 0);
+ iunlock(&pnp);
+ if(cp == nil)
+ error(Egreg);
+ if(!wrconfig(cp, buf))
+ error(Ebadctl);
+ break;
default:
-USED(offset);
error(Egreg);
}
return n;
}
+static int
+wrconfig(Card *c, char *cmd)
+{
+ for(;;) {
+ while(*cmd == ' ' || *cmd == '\t' || *cmd == '\n')
+ cmd++;
+ if(*cmd == '\0')
+ break;
+ if(strncmp(cmd, "foo ", 4) == 0) {
+ print("pnp%d: got foo\n", c->csn);
+ cmd += 4;
+ }
+ else if(strncmp(cmd, "bar ", 4) == 0) {
+ print("pnp%d: got bar\n", c->csn);
+ cmd += 4;
+ }
+ else
+ return 0;
+ }
+ return 1;
+}
+
+
Dev pnpdevtab = {
'$',
"pnp",
M port/portdat.h => port/portdat.h +0 -1
@@ 92,7 92,6 @@ struct Alarms
Proc *head;
};
-#define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */
struct Sargs
{
ulong args[MAXSYSARG];
M port/sysfile.c => port/sysfile.c +8 -8
@@ 358,7 358,7 @@ unionread(Chan *c, void *va, long n)
}
static long
-read(ulong *arg, uvlong *offp)
+read(ulong *arg, vlong *offp)
{
int dir;
long n;
@@ 414,22 414,22 @@ sys_read(ulong *arg)
long
syspread(ulong *arg)
{
- uvlong v;
+ vlong v;
va_list list;
/* use varargs to guarantee alignment of vlong */
va_start(list, arg[2]);
- v = va_arg(list, uvlong);
+ v = va_arg(list, vlong);
va_end(list);
- if(v ==~0ULL)
+ if(v == ~0ULL)
return read(arg, nil);
return read(arg, &v);
}
static long
-write(ulong *arg, uvlong *offp)
+write(ulong *arg, vlong *offp)
{
Chan *c;
long m, n;
@@ 487,15 487,15 @@ sys_write(ulong *arg)
long
syspwrite(ulong *arg)
{
- uvlong v;
+ vlong v;
va_list list;
/* use varargs to guarantee alignment of vlong */
va_start(list, arg[2]);
- v = va_arg(list, uvlong);
+ v = va_arg(list, vlong);
va_end(list);
- if(v ==~0ULL)
+ if(v == ~0ULL)
return write(arg, nil);
return write(arg, &v);