diff options
Diffstat (limited to 'os/manga/archmanga.c')
| -rw-r--r-- | os/manga/archmanga.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/os/manga/archmanga.c b/os/manga/archmanga.c new file mode 100644 index 00000000..45b0f68c --- /dev/null +++ b/os/manga/archmanga.c @@ -0,0 +1,164 @@ +/* + * Manga Balance Plus + */ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "../port/error.h" +#include "io.h" + +#include "../port/netif.h" +#include "etherif.h" +#include "../port/flashif.h" + +enum { + /* GPIO assignment ... */ + + Maxmac= 4, /* number of MAC addresses taken from EEPROM */ +}; + +static uchar macaddrs[Maxmac][Eaddrlen] = { +[0] {0x00, 0x10, 0xa1, 0x00, 0x10, 0x01}, +[1] {0x00, 0x11, 0x6E, 0x00, 0x4A, 0xD4}, +[2] {0x00, 0x10, 0xa1, 0x00, 0x20, 0x01}, /* TO DO */ +}; + +void +archreset(void) +{ + /* TO DO: set GPIO and other key registers? */ + GPIOREG->iopm |= (1<<GPIO_status_orange_o)|(1<<GPIO_status_green_o); + GPIOREG->iopm &= ~(1<<GPIO_button_i); + GPIOREG->iopd &= ~(1<<GPIO_status_orange_o); + GPIOREG->iopd &= ~(1<<GPIO_status_green_o); + GPIOREG->iopc |= 0x8888; + m->cpuhz = 166000000; /* system clock is 125 = 5*CLOCKFREQ */ + m->delayloop = m->cpuhz/1000; +/* + uartdebuginit(); +*/ +} + +void +ledset(int n) +{ + int s; + + s = splhi(); + if(n) + GPIOREG->iopd |= 1<<GPIO_status_green_o; + else + GPIOREG->iopd &= ~(1<<GPIO_status_green_o); + splx(s); +} + +void +archconfinit(void) +{ + ulong *p; + + p = KADDR(PHYSMEMCR+0x30); + conf.topofmem = (((p[0]>>22)<<16)|0xFFFF)+1; +// w = PMGRREG->ppcr & 0x1f; +// m->cpuhz = CLOCKFREQ*(27*2*2); +} + +void +archuartpower(int, int) +{ +} + +void +kbdinit(void) +{ +} + +void +archreboot(void) +{ + dcflushall(); + GPIOREG->iopd |= 1<<GPIO_status_green_o; + GPIOREG->iopd &= ~(1<<GPIO_status_orange_o); +// mmuputctl(mmugetctl() & ~CpCaltivec); /* restore bootstrap's vectors */ +// RESETREG->rsrr = 1; /* software reset */ + for(;;) + //spllo(); + splhi(); +} + +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) +{ + ulong *p; + int w; + + p = KADDR(PHYSMEMCR+0x10); +iprint("Flash %8.8lux %8.8lux %8.8lux\n", p[0], p[1], p[4]); + w = p[4]&3; + if(bank > 0 || w == 0) + return -1; + if(w == 3) + w = 4; + f->type = "cfi8"; + f->addr = (void*)FLASHMEM; + f->size = 0; + f->width = w; + f->interleave = 0; + return 0; +} + +/* + * set ether parameters: the contents should be derived from EEPROM or NVRAM + */ +int +archether(int ctlno, Ether *ether) +{ + ether->nopt = 0; + ether->itype = IRQ; + switch(ctlno){ + case 0: + sprint(ether->type, "ks8695"); + ether->mem = PHYSWANDMA; + ether->port = 0; + ether->irq = IRQwmrps; + break; + case 1: + sprint(ether->type, "ks8695"); + ether->mem = PHYSLANDMA; + ether->port = 1; + ether->irq = IRQlmrps; + ether->maxmtu = ETHERMAXTU+4; /* 802.1[pQ] tags */ + break; + case 2: + sprint(ether->type, "rtl8139"); + ether->mem = 0; + ether->port = 0; + ether->irq = -1; + break; + default: + return -1; + } + memmove(ether->ea, macaddrs[ctlno], Eaddrlen); + return 1; +} + +/* + * TO DO: extract some boot data from user area of flash + */ + +void +eepromscan(void) +{ +} |
