From df8f64d3a4d927a6880040c70ab2fee93f4c901c Mon Sep 17 00:00:00 2001 From: Mark Arigo Date: Fri, 19 Jun 2009 03:41:52 +0000 Subject: Philips SA9200: 1) reset all devices in system_init, 2) revert an earlier change in the sd driver, 3) properly detect the charger, 4) add lcd register defines. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21347 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/ata-sd-pp.c | 9 -- firmware/target/arm/philips/sa9200/lcd-sa9200.c | 109 +++++++++++++++------- firmware/target/arm/philips/sa9200/power-sa9200.c | 2 +- firmware/target/arm/system-pp502x.c | 10 ++ 4 files changed, 86 insertions(+), 44 deletions(-) (limited to 'firmware') diff --git a/firmware/target/arm/ata-sd-pp.c b/firmware/target/arm/ata-sd-pp.c index 9f0263a411..cd3b5ca3f9 100644 --- a/firmware/target/arm/ata-sd-pp.c +++ b/firmware/target/arm/ata-sd-pp.c @@ -666,21 +666,12 @@ static void sd_init_device(int card_no) sd_card_mux(card_no); /* Init NAND */ -#if defined(PHILIPS_SA9200) - MMC_INIT_1 |= (1 << 15); - MMC_INIT_2 |= (1 << 15); - MMC_INIT_2 &= ~(3 << 12); - MMC_INIT_2 |= (1 << 12); - MMC_INIT_1 &= ~(3 << 12); - MMC_INIT_1 |= (1 << 12); -#else MMC_INIT_1 |= (1 << 15); MMC_INIT_2 |= (1 << 15); MMC_INIT_2 &= ~(3 << 12); MMC_INIT_2 |= (1 << 13); MMC_INIT_1 &= ~(3 << 12); MMC_INIT_1 |= (1 << 13); -#endif DEV_EN |= DEV_ATA; /* Enable controller */ DEV_RS |= DEV_ATA; /* Reset controller */ diff --git a/firmware/target/arm/philips/sa9200/lcd-sa9200.c b/firmware/target/arm/philips/sa9200/lcd-sa9200.c index 2181e26e64..d7fe2e9c12 100755 --- a/firmware/target/arm/philips/sa9200/lcd-sa9200.c +++ b/firmware/target/arm/philips/sa9200/lcd-sa9200.c @@ -24,6 +24,44 @@ #include "kernel.h" #include "system.h" +/* The SA9200 controller closely matches the register defines for the + Samsung S6D0151 */ +#define R_START_OSC 0x00 +#define R_DRV_OUTPUT_CONTROL 0x01 +#define R_INVERSION_CONTROL 0x02 +#define R_ENTRY_MODE 0x03 +#define R_DISP_CONTROL 0x07 +#define R_BLANK_PERIOD_CONTROL 0x08 +#define R_FRAME_CYCLE_CONTROL 0x0b +#define R_EXT_INTERFACE_CONTROL 0x0c +#define R_POWER_CONTROL1 0x10 +#define R_GAMMA_CONTROL1 0x11 +#define R_POWER_CONTROL2 0x12 +#define R_POWER_CONTROL3 0x13 +#define R_POWER_CONTROL4 0x14 +#define R_RAM_ADDR_SET 0x21 +#define R_WRITE_DATA_2_GRAM 0x22 +#define R_RAM_READ_DATA 0x22 +#define R_GAMMA_FINE_ADJ_POS1 0x30 +#define R_GAMMA_FINE_ADJ_POS2 0x31 +#define R_GAMMA_FINE_ADJ_POS3 0x32 +#define R_GAMMA_GRAD_ADJ_POS 0x33 +#define R_GAMMA_FINE_ADJ_NEG1 0x34 +#define R_GAMMA_FINE_ADJ_NEG2 0x35 +#define R_GAMMA_FINE_ADJ_NEG3 0x36 +#define R_GAMMA_GRAD_ADJ_NEG 0x37 +#define R_GAMMA_CONTROL3 0x38 +#define R_GATE_SCAN_START_POS 0x40 +#define R_1ST_SCR_DRV_POS 0x42 +#define R_2ND_SCR_DRV_POS 0x43 +#define R_HORIZ_RAM_ADDR_POS 0x44 +#define R_VERT_RAM_ADDR_POS 0x45 +#define R_OSC_CONTROL 0x61 +#define R_LOW_POWER_MODE 0x69 +#define R_PRE_DRIVING_PERIOD 0x70 +#define R_GATE_OUT_PERIOD_CTRL 0x71 +#define R_SOFTWARE_RESET 0x72 + /* Display status */ static unsigned lcd_yuv_options SHAREDBSS_ATTR = 0; @@ -80,51 +118,54 @@ void lcd_init_device(void) LCD1_CONTROL |= 0x1; - lcd_write_reg(0x0000, 0x0001); + lcd_write_reg(R_START_OSC, 0x0001); udelay(50000); - lcd_write_reg(0x0011, 0x171f); - lcd_write_reg(0x0012, 0x0001); - lcd_write_reg(0x0013, 0x08cd); - lcd_write_reg(0x0014, 0x0416); - lcd_write_reg(0x0010, 0x1208); + lcd_write_reg(R_GAMMA_CONTROL1, 0x171f); + lcd_write_reg(R_POWER_CONTROL2, 0x0001); + lcd_write_reg(R_POWER_CONTROL3, 0x08cd); + lcd_write_reg(R_POWER_CONTROL4, 0x0416); + lcd_write_reg(R_POWER_CONTROL1, 0x1208); udelay(50000); - lcd_write_reg(0x0013, 0x081C); + lcd_write_reg(R_POWER_CONTROL3, 0x081c); udelay(200000); - lcd_write_reg(0x0001, 0x0a0c); - lcd_write_reg(0x0002, 0x0200); - lcd_write_reg(0x0003, 0x1030); - lcd_write_reg(0x0007, 0x0005); - lcd_write_reg(0x0008, 0x030a); - lcd_write_reg(0x000b, 0x0000); - lcd_write_reg(0x000c, 0x0000); - lcd_write_reg(0x0030, 0x0000); - lcd_write_reg(0x0031, 0x0204); - lcd_write_reg(0x0032, 0x0001); - lcd_write_reg(0x0033, 0x0600); - lcd_write_reg(0x0034, 0x0607); - lcd_write_reg(0x0035, 0x0305); - lcd_write_reg(0x0036, 0x0707); - lcd_write_reg(0x0037, 0x0006); - lcd_write_reg(0x0038, 0x0400); - lcd_write_reg(0x0040, 0x0000); - lcd_write_reg(0x0042, 0x9f00); - lcd_write_reg(0x0043, 0x0000); - lcd_write_reg(0x0044, 0x7f00); - lcd_write_reg(0x0045, 0x9f00); + lcd_write_reg(R_DRV_OUTPUT_CONTROL, 0x0a0c); + lcd_write_reg(R_INVERSION_CONTROL, 0x0200); + lcd_write_reg(R_ENTRY_MODE, 0x1030); + lcd_write_reg(R_DISP_CONTROL, 0x0005); + lcd_write_reg(R_BLANK_PERIOD_CONTROL, 0x030a); + lcd_write_reg(R_FRAME_CYCLE_CONTROL, 0x0000); + lcd_write_reg(R_EXT_INTERFACE_CONTROL, 0x0000); + + lcd_write_reg(R_GAMMA_FINE_ADJ_POS1, 0x0000); + lcd_write_reg(R_GAMMA_FINE_ADJ_POS2, 0x0204); + lcd_write_reg(R_GAMMA_FINE_ADJ_POS3, 0x0001); + lcd_write_reg(R_GAMMA_GRAD_ADJ_POS, 0x0600); + lcd_write_reg(R_GAMMA_FINE_ADJ_NEG1, 0x0607); + lcd_write_reg(R_GAMMA_FINE_ADJ_NEG2, 0x0305); + lcd_write_reg(R_GAMMA_FINE_ADJ_NEG3, 0x0707); + lcd_write_reg(R_GAMMA_GRAD_ADJ_NEG, 0x0006); + lcd_write_reg(R_GAMMA_CONTROL3, 0x0400); + + lcd_write_reg(R_GATE_SCAN_START_POS, 0x0000); + lcd_write_reg(R_1ST_SCR_DRV_POS, 0x9f00); + lcd_write_reg(R_2ND_SCR_DRV_POS, 0x0000); + lcd_write_reg(R_HORIZ_RAM_ADDR_POS, 0x7f00); + lcd_write_reg(R_VERT_RAM_ADDR_POS, 0x9f00); + lcd_write_reg(0x00a8, 0x0125); lcd_write_reg(0x00a9, 0x0014); lcd_write_reg(0x00a7, 0x0022); - lcd_write_reg(0x0007, 0x0021); + lcd_write_reg(R_DISP_CONTROL, 0x0021); udelay(40000); - lcd_write_reg(0x0007, 0x0023); + lcd_write_reg(R_DISP_CONTROL, 0x0023); udelay(40000); - lcd_write_reg(0x0007, 0x1037); + lcd_write_reg(R_DISP_CONTROL, 0x1037); - lcd_write_reg(0x0021, 0x0000); + lcd_write_reg(R_RAM_ADDR_SET, 0x0000); #endif } @@ -195,8 +236,8 @@ void lcd_update_rect(int x, int y, int width, int height) addr = &lcd_framebuffer[y][x]; do { - lcd_write_reg(0x0021, ((y++ & 0xff) << 8) | (x & 0xff)); - lcd_send_command(0x0022); + lcd_write_reg(R_RAM_ADDR_SET, ((y++ & 0xff) << 8) | (x & 0xff)); + lcd_send_command(R_WRITE_DATA_2_GRAM); int w = width; do { diff --git a/firmware/target/arm/philips/sa9200/power-sa9200.c b/firmware/target/arm/philips/sa9200/power-sa9200.c index 5da1fc5fc4..e0bdfcf8ea 100644 --- a/firmware/target/arm/philips/sa9200/power-sa9200.c +++ b/firmware/target/arm/philips/sa9200/power-sa9200.c @@ -97,7 +97,7 @@ unsigned int power_input_status(void) /* GPIOF indicates that the connector is present, GPIOB indicates that there's power there too. Same status bits for both USB and the charger. */ - if (!(GPIOF_INPUT_VAL & 0x80) && !(GPIOB_INPUT_VAL & 0x80)) + if (!(GPIOF_INPUT_VAL & 0x80) && (GPIOB_INPUT_VAL & 0x40)) status = POWER_INPUT_MAIN_CHARGER; return status; diff --git a/firmware/target/arm/system-pp502x.c b/firmware/target/arm/system-pp502x.c index 12ae7a9d3b..4735cd8d83 100644 --- a/firmware/target/arm/system-pp502x.c +++ b/firmware/target/arm/system-pp502x.c @@ -126,6 +126,10 @@ void __attribute__((interrupt("IRQ"))) irq_handler(void) } /* end MROBE_100 */ #elif defined(PHILIPS_SA9200) + else if (CPU_HI_INT_STAT & GPIO0_MASK) { + if (GPIOD_INT_STAT & 0x02) + button_int(); + } else if (CPU_HI_INT_STAT & GPIO1_MASK) { if (GPIOF_INT_STAT & 0x80) usb_insert_int(); @@ -421,6 +425,12 @@ void system_init(void) DEV_RS2 = 0xffffffff; DEV_RS = 0x00000000; DEV_RS2 = 0x00000000; +#elif defined(PHILIPS_SA9200) + /* reset all allowed devices */ + DEV_RS = 0x3ffffef8; + DEV_RS2 = 0xffffffff; + DEV_RS = 0x00000000; + DEV_RS2 = 0x00000000; #elif defined(IPOD_4G) /* set minimum startup configuration */ DEV_EN = 0xc2020124; -- cgit v1.2.3