diff options
Diffstat (limited to 'os/cerf1110/archcerf.c')
| -rw-r--r-- | os/cerf1110/archcerf.c | 177 |
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; +} |
