@@ 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);
@@ 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;
@@ 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;
+}
@@ 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;
}