summaryrefslogtreecommitdiff
path: root/os/cerf1110/archcerf.c
diff options
context:
space:
mode:
Diffstat (limited to 'os/cerf1110/archcerf.c')
-rw-r--r--os/cerf1110/archcerf.c177
1 files changed, 177 insertions, 0 deletions
diff --git a/os/cerf1110/archcerf.c b/os/cerf1110/archcerf.c
new file mode 100644
index 00000000..86eb902e
--- /dev/null
+++ b/os/cerf1110/archcerf.c
@@ -0,0 +1,177 @@
+/*
+ * Intrinsyc Cerf cube
+ */
+#include "u.h"
+#include "../port/lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "../port/error.h"
+#include "io.h"
+#include "draw.h"
+#include <memdraw.h>
+
+#include "../port/netif.h"
+#include "etherif.h"
+#include "../port/flashif.h"
+
+enum {
+ /* Cerf GPIO assignment */
+ LED0 = 1<<0, /* active high */
+ LED1 = 1<<1,
+ LED2 = 1<<2,
+ LED3 = 1<<3,
+ /* 4 to 15 appear on J2 */
+ CFBVD1 = 1<<20,
+ CFBVD2 = 1<<19,
+ CFReset = 1<<21, /* active low for IDE mode; active high for IO or memory mode */
+ CFRdypin = 22,
+ CFRdy = 1<<CFRdypin, /* RDY/nBSY */
+ CFnCDxpin = 23,
+ CFnCDx = 1<<CFnCDxpin, /* low => card inserted */
+ EnableRS232In = 1<<24,
+ EnableRS232Out = 1<<25,
+ /* CS8900 interrupt on 26, active high */
+ /* CS8900 nHWSLEEP on 27 */
+};
+
+void
+archreset(void)
+{
+ GpioReg *g = GPIOREG;
+
+ g->grer = 0;
+ g->gfer = 0;
+ g->gedr = g->gedr;
+ g->gpdr = 0;
+
+ g->gpdr = EnableRS232In | EnableRS232Out | CFReset;
+ g->gpsr = EnableRS232In | EnableRS232Out;
+
+ GPCLKREG->gpclkr0 |= 1; /* SUS=1 for uart on serial 1 */
+}
+
+void
+archconfinit(void)
+{
+ int w;
+
+ conf.topofmem = 0xC0000000+32*MB;
+ w = PMGRREG->ppcr & 0x1f;
+ m->cpuhz = CLOCKFREQ*(w*4+16);
+
+ conf.useminicache = 1;
+ conf.portrait = 1; /* should take from param flash or allow dynamic change */
+}
+
+void
+archconsole(void)
+{
+ uartspecial(0, 38400, 'n', &kbdq, &printq, kbdcr2nl);
+}
+
+void
+archuartpower(int, int)
+{
+}
+
+void
+kbdinit(void)
+{
+}
+
+void
+archreboot(void)
+{
+ dcflushall();
+ GPIOREG->gedr = 1<<0;
+ mmuputctl(mmugetctl() & ~CpCaltivec); /* restore bootstrap's vectors */
+ RESETREG->rsrr = 1; /* software reset */
+ for(;;)
+ spllo();
+}
+
+void
+archflashwp(Flash*, int)
+{
+}
+
+/*
+ * for devflash.c:/^flashreset
+ * retrieve flash type, virtual base and length and return 0;
+ * return -1 on error (no flash)
+ */
+int
+archflashreset(int bank, Flash *f)
+{
+ if(bank != 0)
+ return -1;
+ f->type = "cfi16";
+ f->addr = KADDR(FLASHMEM);
+ f->size = 0;
+ f->width = 2;
+ return 0;
+}
+
+/*
+ * pcmcia
+ */
+int
+pcmpowered(int slotno)
+{
+ if(slotno)
+ return 0;
+ return 3;
+}
+
+void
+pcmpower(int slotno, int on)
+{
+ USED(slotno, on);
+}
+
+void
+pcmreset(int slot)
+{
+ if(slot != 0)
+ return;
+ GPIOREG->gpsr = CFReset;
+ delay(100);
+ GPIOREG->gpcr = CFReset;
+}
+
+int
+pcmpin(int slot, int type)
+{
+ if(slot)
+ return -1;
+ switch(type){
+ case PCMready:
+ return CFRdypin;
+ case PCMeject:
+ return CFnCDxpin;
+ case PCMstschng:
+ return -1;
+ }
+}
+
+void
+pcmsetvpp(int slot, int vpp)
+{
+ USED(slot, vpp);
+}
+
+/*
+ * set ether parameters: the contents should be derived from EEPROM or NVRAM
+ */
+int
+archether(int ctlno, Ether *ether)
+{
+ if(ctlno > 0)
+ return -1;
+ sprint(ether->type, "CS8900");
+ ether->nopt = 0;
+ ether->irq = 26; /* GPIO */
+ ether->itype = BusGPIOrising;
+ return 1;
+}