From c47f810bb8411729eea2565ecd43c03ce7d705e6 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 8 Oct 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-10-08 --- bitsy/clock.c | 3 -- bitsy/fns.h | 3 ++ bitsy/io.h | 94 ++++++++++++++++++++++++++++++++++++--------------- bitsy/main.c | 66 ++++++++++++++++++++++++++++++------ port/xalloc.c | 3 +- 5 files changed, 125 insertions(+), 44 deletions(-) diff --git a/bitsy/clock.c b/bitsy/clock.c index caf4957c9575009f4002836e91e8b8cd20ab5bdc..284f9e50fb56d24638c601e3abf48c10869e1ae7 100644 --- a/bitsy/clock.c +++ b/bitsy/clock.c @@ -76,11 +76,8 @@ clockintr(Ureg*, void*) /* post interrupt 1/HZ secs from now */ timerregs->osmr[0] = timerregs->oscr + ClockFreq/HZ; - iprint("timer interrupt\n"); m->ticks++; - if(m->ticks >= 100) - exit(0); } void diff --git a/bitsy/fns.h b/bitsy/fns.h index 88c5483e5aaaff2deaabe576f208b8ae1b9dd3ed..b1f9ed8a113ea46e4b9c962d7240b3f9873b7d5a 100644 --- a/bitsy/fns.h +++ b/bitsy/fns.h @@ -17,6 +17,8 @@ void idle(void); #define idlehands() /* nothing to do in the runproc */ void intrenable(int, void (*)(Ureg*, void*), void*, char*); int iprint(char*, ...); +void irpower(int); +void lcdpower(int); void mappedIvecEnable(void); void mappedIvecDisable(void); void* mapspecial(ulong, int); @@ -33,6 +35,7 @@ void putdac(ulong); void putttb(ulong); void putpid(ulong); void reset(void); +void rs232power(int); Uart* uartsetup(PhysUart*, void*, ulong, char*); void sa1100_uartsetup(void); void screeninit(void); diff --git a/bitsy/io.h b/bitsy/io.h index 4f29a58a23531d6273ed2d2cfdfc8388ba4801e1..ef46f3e213123139f59f771f9451153c30dd9ba2 100644 --- a/bitsy/io.h +++ b/bitsy/io.h @@ -48,34 +48,34 @@ enum */ enum { - PWR_ON_i= 1<<0, /* power button */ - UP_IRQ_i= 1<<1, /* microcontroller interrupts */ - LDD8_o= 1<<2, /* LCD data 8-15 */ - LDD9_o= 1<<3, - LDD10_o= 1<<4, - LDD11_o= 1<<5, - LDD12_o= 1<<6, - LDD13_o= 1<<7, - LDD14_o= 1<<8, - LDD15_o= 1<<9, - CARD_IND1_i= 1<<10, /* card inserted in PCMCIA socket 1 */ - CARD_IRQ1_i= 1<<11, /* PCMCIA socket 1 interrupt */ - CLK_SET0_o= 1<<12, /* clock selects for audio codec */ - CLK_SET1_o= 1<<13, - L3_SDA_io= 1<<14, /* UDA1341 interface */ - L3_MODE_o= 1<<15, - L3_SCLK_o= 1<<16, - CARD_IND0_i= 1<<17, /* card inserted in PCMCIA socket 0 */ - KEY_ACT_i= 1<<18, /* hot key from cradle */ - SYS_CLK_i= 1<<19, /* clock from codec */ - BAT_FAULT_i= 1<<20, /* battery fault */ - CARD_IRQ0_i= 1<<21, /* PCMCIA socket 0 interrupt */ - LOCK_i= 1<<22, /* expansion pack lock/unlock */ - COM_DCD_i= 1<<23, /* DCD from UART3 */ - OPT_IRQ_i= 1<<24, /* expansion pack IRQ */ - COM_CTS_i= 1<<25, /* CTS from UART3 */ - COM_RTS_oi= 1<<26, /* RTS to UART3 */ - OPT_IND_i= 1<<27, /* expansion pack inserted */ + GPIO_PWR_ON_i= 1<<0, /* power button */ + GPIO_UP_IRQ_i= 1<<1, /* microcontroller interrupts */ + GPIO_LDD8_o= 1<<2, /* LCD data 8-15 */ + GPIO_LDD9_o= 1<<3, + GPIO_LDD10_o= 1<<4, + GPIO_LDD11_o= 1<<5, + GPIO_LDD12_o= 1<<6, + GPIO_LDD13_o= 1<<7, + GPIO_LDD14_o= 1<<8, + GPIO_LDD15_o= 1<<9, + GPIO_CARD_IND1_i= 1<<10, /* card inserted in PCMCIA socket 1 */ + GPIO_CARD_IRQ1_i= 1<<11, /* PCMCIA socket 1 interrupt */ + GPIO_CLK_SET0_o= 1<<12, /* clock selects for audio codec */ + GPIO_CLK_SET1_o= 1<<13, + GPIO_L3_SDA_io= 1<<14, /* UDA1341 interface */ + GPIO_L3_MODE_o= 1<<15, + GPIO_L3_SCLK_o= 1<<16, + GPIO_CARD_IND0_i= 1<<17, /* card inserted in PCMCIA socket 0 */ + GPIO_KEY_ACT_i= 1<<18, /* hot key from cradle */ + GPIO_SYS_CLK_i= 1<<19, /* clock from codec */ + GPIO_BAT_FAULT_i= 1<<20, /* battery fault */ + GPIO_CARD_IRQ0_i= 1<<21, /* PCMCIA socket 0 interrupt */ + GPIO_LOCK_i= 1<<22, /* expansion pack lock/unlock */ + GPIO_COM_DCD_i= 1<<23, /* DCD from UART3 */ + GPIO_OPT_IRQ_i= 1<<24, /* expansion pack IRQ */ + GPIO_COM_CTS_i= 1<<25, /* CTS from UART3 */ + GPIO_COM_RTS_o= 1<<26, /* RTS to UART3 */ + GPIO_OPT_IND_i= 1<<27, /* expansion pack inserted */ }; enum @@ -164,3 +164,41 @@ struct Uart Rendez r; }; + +/* general purpose I/O lines control registers */ +typedef struct GPIOregs GPIOregs; +struct GPIOregs +{ + ulong level; /* 1 == high */ + ulong direction; /* 1 == output */ + ulong set; /* a 1 sets the bit, 0 leaves it alone */ + ulong clear; /* a 1 clears the bit, 0 leaves it alone */ + ulong rising; /* rising edge detect enable */ + ulong falling; /* falling edge detect enable */ + ulong edgestatus; /* writing a 1 bit clears */ + ulong altfunc; /* turn on alternate function for any set bits */ +}; + +extern GPIOregs *gpioregs; + +/* extra general purpose I/O bits, output only */ +enum +{ + EGPIO_prog_flash= 1<<0, + EGPIO_pcmcia_reset= 1<<1, + EGPIO_exppack_reset= 1<<2, + EGPIO_codec_reset= 1<<3, + EGPIO_exp_nvram_power= 1<<4, + EGPIO_exp_full_power= 1<<5, + EGPIO_lcd_3v= 1<<6, + EGPIO_rs232_power= 1<<7, + EGPIO_lcd_ic_power= 1<<8, + EGPIO_ir_power= 1<<9, + EGPIO_audio_power= 1<<10, + EGPIO_audio_ic_power= 1<<11, + EGPIO_audio_mute= 1<<12, + EGPIO_fir= 1<<13, /* not set is sir */ + EGPIO_lcd_5v= 1<<14, + EGPIO_lcd_9v= 1<<15, +}; +extern ulong *egpioreg; diff --git a/bitsy/main.c b/bitsy/main.c index 1fcc23ac9747d1f61f2b044f7ffe4ff06dd3bdf6..315655b40adcd51564ddb78cc832eeb590325ed2 100644 --- a/bitsy/main.c +++ b/bitsy/main.c @@ -11,6 +11,8 @@ Mach *m; Conf conf; +static void gpioinit(void); + void main(void) { @@ -20,26 +22,18 @@ main(void) /* point to Mach structure */ m = (Mach*)MACHADDR; + rs232power(1); iprint("bitsy kernel\n"); confinit(); iprint("%d pages %lux(%lud) %lux(%lud)\n", conf.npage, conf.base0, conf.npage0, conf.base1, conf.npage1); xinit(); - iprint("after xinit\n"); - iprint("testing 2 second delay\n"); - delay(2000); - iprint("done\n"); mmuinit(); sa1100_uartsetup(); - iprint("after mmuinit\n"); + gpioinit(); trapinit(); - iprint("after trapinit\n"); clockinit(); - iprint("after clockinit\n"); -trapdump("before spllo"); spllo(); - iprint("after spllo\n"); - delay(10000); -trapdump("after delay"); + delay(1000); exit(1); } @@ -187,3 +181,53 @@ confinit(void) conf.copymode = 0; /* copy on write */ } +GPIOregs *gpioregs; +ulong *egpioreg; + +static void +gpioinit(void) +{ + gpioregs = mapspecial(GPIOREGS, 32); + gpioregs->direction = + GPIO_LDD8_o|GPIO_LDD9_o|GPIO_LDD10_o|GPIO_LDD11_o + |GPIO_LDD12_o|GPIO_LDD13_o|GPIO_LDD14_o|GPIO_LDD15_o + |GPIO_CLK_SET0_o|GPIO_CLK_SET1_o + |GPIO_L3_SDA_io|GPIO_L3_MODE_o|GPIO_L3_SCLK_o + |GPIO_COM_RTS_o; + gpioregs->rising = 0; + gpioregs->falling = 0; + + egpioreg = mapspecial(EGPIOREGS, 4); +} + +static ulong egpiosticky; + +void +rs232power(int on) +{ + if(on) + egpiosticky |= EGPIO_rs232_power; + else + egpiosticky &= ~EGPIO_rs232_power; + *egpioreg = egpiosticky; +} + +void +irpower(int on) +{ + if(on) + egpiosticky |= EGPIO_ir_power; + else + egpiosticky &= ~EGPIO_ir_power; + *egpioreg = egpiosticky; +} + +void +lcdpower(int on) +{ + if(on) + egpiosticky |= EGPIO_lcd_3v|EGPIO_lcd_ic_power|EGPIO_lcd_5v|EGPIO_lcd_9v; + else + egpiosticky &= ~(EGPIO_lcd_3v|EGPIO_lcd_ic_power|EGPIO_lcd_5v|EGPIO_lcd_9v); + *egpioreg = egpiosticky; +} diff --git a/port/xalloc.c b/port/xalloc.c index 4735c0a62039ba2fb28bb14ad7fe50da4016129c..977a0035d93838907775b1d6fdbf11f5812447c0 100644 --- a/port/xalloc.c +++ b/port/xalloc.c @@ -81,7 +81,6 @@ xinit(void) conf.base1 = (ulong)KADDR(conf.base1); conf.npage0 = (ulong)KADDR(conf.npage0); conf.npage1 = (ulong)KADDR(conf.npage1); -iprint("xinit returning\n"); } void* @@ -219,7 +218,7 @@ xhole(ulong addr, ulong size) if(xlists.flist == nil) { iunlock(&xlists); - iprint("xfree: no free holes, leaked %lud bytes\n", size); + print("xfree: no free holes, leaked %lud bytes\n", size); return; }