#include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "../port/error.h" #include "io.h" #include "image.h" #include #include "screen.h" #include "bootparam.h" enum { /* U20, PCF8574 @i2c addr 0x40 */ I2C_MUTE_SPKR = 0, I2C_MUTE_HEADSET = 1, I2C_VCC_5EN = 2, I2C_LCD_EN = 3, I2C_TAD_FL_WP = 4, /* negative logic */ I2C_RS232_ON_OFF = 5, /* U21, PCF8574 @i2c addr 0x42 */ I2C_LCD_BACK_DIS = 10, I2C_LCD_YEE_DIS = 11, I2C_CHRG1 = 12, I2C_CHRG2 = 13, /* * GPIO asignments. Not all used in this file, but gathered here for * documental purposes. */ gpio_switch = 0, /* in, S7 */ gpio_handset = 1, /* in, S9, handset off hook */ gpio_cid = 2, /* out, enable DTAD DAA caller ID */ gpio_batt_thrm = 3, /* in, some smartbat thingy */ gpio_ring = 4, /* in, DTAD DAA ring indicator */ gpio_hook = 5, /* out, DTAD DAA off hook */ gpio_i2c_sda = 6, /* in/out, as per i2c protocol */ gpio_i2c_scl = 7, /* in/out, as per i2c protocol */ gpio_tpad_clk = 8, /* out, clock for touchpad connector */ gpio_tpad_data = 9, /* in, data in for touchpad connector */ gpio_mosi = 10, /* out, spi (to kbd interface) */ gpio_miso = 11, /* in, spi (to kbd interface) */ gpio_sclk = 12, /* out, spi (to kbd interface) */ gpio_sfrm = 13, /* out, spi (to kbd interface) */ gpio_flashwp = 14, /* out, negative logic */ gpio_irq_dtad = 15, /* in, ack- line from dtad */ gpio_kpad_c1 = 16, /* in, keypad column 1 */ gpio_kpad_c2 = 17, /* in, keypad column 1 */ gpio_kpad_c3 = 18, /* in, keypad column 1 */ gpio_kpad_c4 = 19, /* in, keypad column 1 */ gpio_debug = 20, /* in, S5, debug/normal switch (polarity???) */ gpio_irda_sd = 21, /* out, purpose unclear (XXX TFDS6000 data sheet?) */ gpio_wkup = 23, /* out, to kbd interface -- negative logic */ gpio_wuko = 24, /* in???, to kbd interface */ gpio_atn = 25, /* in, spi (to kbd interface) -- negative logic */ gpio_led1 = 26, /* out */ gpio_led2 = 27, /* out */ /* CODEC GPIO's, via MCP */ MODEMHOOK= BIT(8), /* out, UCB DAA off hook */ RINGIND= BIT(7), /* in, UCB DAA ring indicator */ }; int gpio_irq_ucb1200 = 22; extern int cflag; extern int consoleprint; extern int redirectconsole; extern int main_pool_pcnt; extern int heap_pool_pcnt; extern int image_pool_pcnt; extern int kernel_pool_pcnt; extern char debug_keys; extern Vmode default_vmode; int smodem_HybridDelay = 0x23; /* see comment in devsm.c */ int i2c_reset(void); int i2c_setpin(int b); int i2c_clrpin(int b); void archreset(void) { /* put the hardware in a known state */ *GFER = 0; *GRER = 0; *GEDR = *GEDR; *GPDR = (1<himem; conf.flashbase = bootparam->flashbase; conf.cpuspeed = bootparam->cpuspeed; conf.pagetable = bootparam->pagetable; conf.usebabycache = 1; conf.cansetbacklight = 1; conf.cansetcontrast = 0; conf.remaplo = 1; } void archreboot(void) { bootparam->reboot(1); } void lights(ulong x) { if (x&1) *GPSR = (1<> 1); return (*GPLR & b) == 0 ? -1 : 1; } static int i2c_clear(int pin) { ulong b = 1< 0) return -1; i2c_set(gpio_i2c_scl); timer_delay(US2TMR(1)); i2c_clear(gpio_i2c_scl); timer_delay(US2TMR(5)); return 1; } static void i2c_putbyte(int b) { int m; for(m=0x80; m; m >>= 1) { if(b&m) i2c_set(gpio_i2c_sda); else i2c_clear(gpio_i2c_sda); i2c_clear(gpio_i2c_scl); timer_delay(US2TMR(1)); i2c_set(gpio_i2c_scl); timer_delay(US2TMR(1)); i2c_clear(gpio_i2c_scl); } } static int i2c_start(void) { if((*GPLR & (1<>3; i2c_iactl[i] |= (1 << (b&7)); return i2c_write(i); } int i2c_clrpin(int b) { int i = b>>3; i2c_iactl[i] &= ~(1 << (b&7)); return i2c_write(i); } int i2c_reset(void) { int i; if(i2c_set(gpio_i2c_sda) < 0) return -1; if(i2c_clear(gpio_i2c_scl) < 0) return -1; for(i=0; i<3; i++) if(i2c_stop() < 0) return -1; i2c_write(0); i2c_write(1); return 0; } static void archdtadspeaker(int on) { if (on) i2c_clrpin( I2C_MUTE_SPKR ); else i2c_setpin( I2C_MUTE_SPKR ); } static void archdtadhandset(int on) { if (on) i2c_clrpin( I2C_MUTE_HEADSET ); else i2c_setpin( I2C_MUTE_HEADSET ); } /* static void archdtadflwp(int on) { if (on) i2c_clrpin( I2C_TAD_FL_WP ); else i2c_setpin( I2C_TAD_FL_WP ); } */