| /* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| * 02110-1301, USA. |
| */ |
| |
| #include "msm_fb.h" |
| |
| #include <linux/memory.h> |
| #include <linux/kernel.h> |
| #include <linux/sched.h> |
| #include <linux/time.h> |
| #include <linux/init.h> |
| #include <linux/interrupt.h> |
| #include "linux/proc_fs.h" |
| |
| #include <linux/delay.h> |
| |
| #include <mach/hardware.h> |
| #include <linux/io.h> |
| |
| #include <asm/system.h> |
| #include <asm/mach-types.h> |
| |
| /* #define TMD20QVGA_LCD_18BPP */ |
| #define QVGA_WIDTH 240 |
| #define QVGA_HEIGHT 320 |
| |
| #ifdef TMD20QVGA_LCD_18BPP |
| #define DISP_QVGA_18BPP(x) ((((x)<<2) & 0x3FC00)|(( (x)<<1)& 0x1FE)) |
| #define DISP_REG(name) uint32 register_##name; |
| #define OUTPORT(x, y) outpdw(x, y) |
| #define INPORT(x) inpdw(x) |
| #else |
| #define DISP_QVGA_18BPP(x) (x) |
| #define DISP_REG(name) uint16 register_##name; |
| #define OUTPORT(x, y) outpw(x, y) |
| #define INPORT(x) intpw(x) |
| #endif |
| |
| static void *DISP_CMD_PORT; |
| static void *DISP_DATA_PORT; |
| |
| #define DISP_RNTI 0x10 |
| |
| #define DISP_CMD_OUT(cmd) OUTPORT(DISP_CMD_PORT, DISP_QVGA_18BPP(cmd)) |
| #define DISP_DATA_OUT(data) OUTPORT(DISP_DATA_PORT, data) |
| #define DISP_DATA_IN() INPORT(DISP_DATA_PORT) |
| |
| #if (defined(TMD20QVGA_LCD_18BPP)) |
| #define DISP_DATA_OUT_16TO18BPP(x) \ |
| DISP_DATA_OUT((((x)&0xf800)<<2|((x)&0x80000)>>3) \ |
| | (((x)&0x7e0)<<1) \ |
| | (((x)&0x1F)<<1|((x)&0x10)>>4)) |
| #else |
| #define DISP_DATA_OUT_16TO18BPP(x) \ |
| DISP_DATA_OUT(x) |
| #endif |
| |
| #define DISP_WRITE_OUT(addr, data) \ |
| register_##addr = DISP_QVGA_18BPP(data); \ |
| DISP_CMD_OUT(addr); \ |
| DISP_DATA_OUT(register_##addr); |
| |
| #define DISP_UPDATE_VALUE(addr, bitmask, data) \ |
| DISP_WRITE_OUT(##addr, (register_##addr & ~(bitmask)) | (data)); |
| |
| #define DISP_VAL_IF(bitvalue, bitmask) \ |
| ((bitvalue) ? (bitmask) : 0) |
| |
| /* QVGA = 256 x 320 */ |
| /* actual display is 240 x 320...offset by 0x10 */ |
| #define DISP_ROW_COL_TO_ADDR(row, col) ((row) * 0x100 + col) |
| #define DISP_SET_RECT(ulhc_row, lrhc_row, ulhc_col, lrhc_col) \ |
| { \ |
| DISP_WRITE_OUT(DISP_HORZ_RAM_ADDR_POS_1_ADDR, (ulhc_col) + tmd20qvga_panel_offset); \ |
| DISP_WRITE_OUT(DISP_HORZ_RAM_ADDR_POS_2_ADDR, (lrhc_col) + tmd20qvga_panel_offset); \ |
| DISP_WRITE_OUT(DISP_VERT_RAM_ADDR_POS_1_ADDR, (ulhc_row)); \ |
| DISP_WRITE_OUT(DISP_VERT_RAM_ADDR_POS_2_ADDR, (lrhc_row)); \ |
| DISP_WRITE_OUT(DISP_RAM_ADDR_SET_1_ADDR, (ulhc_col) + tmd20qvga_panel_offset); \ |
| DISP_WRITE_OUT(DISP_RAM_ADDR_SET_2_ADDR, (ulhc_row)); \ |
| } |
| |
| #define WAIT_MSEC(msec) mdelay(msec) |
| |
| /* |
| * TMD QVGA Address |
| */ |
| /* Display Control */ |
| #define DISP_START_OSCILLATION_ADDR 0x000 |
| DISP_REG(DISP_START_OSCILLATION_ADDR) |
| #define DISP_DRIVER_OUTPUT_CTL_ADDR 0x001 |
| DISP_REG(DISP_DRIVER_OUTPUT_CTL_ADDR) |
| #define DISP_LCD_DRIVING_SIG_ADDR 0x002 |
| DISP_REG(DISP_LCD_DRIVING_SIG_ADDR) |
| #define DISP_ENTRY_MODE_ADDR 0x003 |
| DISP_REG(DISP_ENTRY_MODE_ADDR) |
| #define DISP_DISPLAY_CTL_1_ADDR 0x007 |
| DISP_REG(DISP_DISPLAY_CTL_1_ADDR) |
| #define DISP_DISPLAY_CTL_2_ADDR 0x008 |
| DISP_REG(DISP_DISPLAY_CTL_2_ADDR) |
| |
| /* DISPLAY MODE 0x009 partial display not supported */ |
| #define DISP_POWER_SUPPLY_INTF_ADDR 0x00A |
| DISP_REG(DISP_POWER_SUPPLY_INTF_ADDR) |
| |
| /* DISPLAY MODE 0x00B xZoom feature is not supported */ |
| #define DISP_EXT_DISPLAY_CTL_1_ADDR 0x00C |
| DISP_REG(DISP_EXT_DISPLAY_CTL_1_ADDR) |
| |
| #define DISP_FRAME_CYCLE_CTL_ADDR 0x00D |
| DISP_REG(DISP_FRAME_CYCLE_CTL_ADDR) |
| |
| #define DISP_EXT_DISPLAY_CTL_2_ADDR 0x00E |
| DISP_REG(DISP_EXT_DISPLAY_CTL_2_ADDR) |
| |
| #define DISP_EXT_DISPLAY_CTL_3_ADDR 0x00F |
| DISP_REG(DISP_EXT_DISPLAY_CTL_3_ADDR) |
| |
| #define DISP_LTPS_CTL_1_ADDR 0x012 |
| DISP_REG(DISP_LTPS_CTL_1_ADDR) |
| #define DISP_LTPS_CTL_2_ADDR 0x013 |
| DISP_REG(DISP_LTPS_CTL_2_ADDR) |
| #define DISP_LTPS_CTL_3_ADDR 0x014 |
| DISP_REG(DISP_LTPS_CTL_3_ADDR) |
| #define DISP_LTPS_CTL_4_ADDR 0x018 |
| DISP_REG(DISP_LTPS_CTL_4_ADDR) |
| #define DISP_LTPS_CTL_5_ADDR 0x019 |
| DISP_REG(DISP_LTPS_CTL_5_ADDR) |
| #define DISP_LTPS_CTL_6_ADDR 0x01A |
| DISP_REG(DISP_LTPS_CTL_6_ADDR) |
| #define DISP_AMP_SETTING_ADDR 0x01C |
| DISP_REG(DISP_AMP_SETTING_ADDR) |
| #define DISP_MODE_SETTING_ADDR 0x01D |
| DISP_REG(DISP_MODE_SETTING_ADDR) |
| #define DISP_POFF_LN_SETTING_ADDR 0x01E |
| DISP_REG(DISP_POFF_LN_SETTING_ADDR) |
| /* Power Contol */ |
| #define DISP_POWER_CTL_1_ADDR 0x100 |
| DISP_REG(DISP_POWER_CTL_1_ADDR) |
| #define DISP_POWER_CTL_2_ADDR 0x101 |
| DISP_REG(DISP_POWER_CTL_2_ADDR) |
| #define DISP_POWER_CTL_3_ADDR 0x102 |
| DISP_REG(DISP_POWER_CTL_3_ADDR) |
| #define DISP_POWER_CTL_4_ADDR 0x103 |
| DISP_REG(DISP_POWER_CTL_4_ADDR) |
| #define DISP_POWER_CTL_5_ADDR 0x104 |
| DISP_REG(DISP_POWER_CTL_5_ADDR) |
| #define DISP_POWER_CTL_6_ADDR 0x105 |
| DISP_REG(DISP_POWER_CTL_6_ADDR) |
| #define DISP_POWER_CTL_7_ADDR 0x106 |
| DISP_REG(DISP_POWER_CTL_7_ADDR) |
| /* RAM Access */ |
| #define DISP_RAM_ADDR_SET_1_ADDR 0x200 |
| DISP_REG(DISP_RAM_ADDR_SET_1_ADDR) |
| #define DISP_RAM_ADDR_SET_2_ADDR 0x201 |
| DISP_REG(DISP_RAM_ADDR_SET_2_ADDR) |
| #define DISP_CMD_RAMRD DISP_CMD_RAMWR |
| #define DISP_CMD_RAMWR 0x202 |
| DISP_REG(DISP_CMD_RAMWR) |
| #define DISP_RAM_DATA_MASK_1_ADDR 0x203 |
| DISP_REG(DISP_RAM_DATA_MASK_1_ADDR) |
| #define DISP_RAM_DATA_MASK_2_ADDR 0x204 |
| DISP_REG(DISP_RAM_DATA_MASK_2_ADDR) |
| /* Gamma Control, Contrast, Gray Scale Setting */ |
| #define DISP_GAMMA_CONTROL_1_ADDR 0x300 |
| DISP_REG(DISP_GAMMA_CONTROL_1_ADDR) |
| #define DISP_GAMMA_CONTROL_2_ADDR 0x301 |
| DISP_REG(DISP_GAMMA_CONTROL_2_ADDR) |
| #define DISP_GAMMA_CONTROL_3_ADDR 0x302 |
| DISP_REG(DISP_GAMMA_CONTROL_3_ADDR) |
| #define DISP_GAMMA_CONTROL_4_ADDR 0x303 |
| DISP_REG(DISP_GAMMA_CONTROL_4_ADDR) |
| #define DISP_GAMMA_CONTROL_5_ADDR 0x304 |
| DISP_REG(DISP_GAMMA_CONTROL_5_ADDR) |
| /* Coordinate Control */ |
| #define DISP_VERT_SCROLL_CTL_1_ADDR 0x400 |
| DISP_REG(DISP_VERT_SCROLL_CTL_1_ADDR) |
| #define DISP_VERT_SCROLL_CTL_2_ADDR 0x401 |
| DISP_REG(DISP_VERT_SCROLL_CTL_2_ADDR) |
| #define DISP_SCREEN_1_DRV_POS_1_ADDR 0x402 |
| DISP_REG(DISP_SCREEN_1_DRV_POS_1_ADDR) |
| #define DISP_SCREEN_1_DRV_POS_2_ADDR 0x403 |
| DISP_REG(DISP_SCREEN_1_DRV_POS_2_ADDR) |
| #define DISP_SCREEN_2_DRV_POS_1_ADDR 0x404 |
| DISP_REG(DISP_SCREEN_2_DRV_POS_1_ADDR) |
| #define DISP_SCREEN_2_DRV_POS_2_ADDR 0x405 |
| DISP_REG(DISP_SCREEN_2_DRV_POS_2_ADDR) |
| #define DISP_HORZ_RAM_ADDR_POS_1_ADDR 0x406 |
| DISP_REG(DISP_HORZ_RAM_ADDR_POS_1_ADDR) |
| #define DISP_HORZ_RAM_ADDR_POS_2_ADDR 0x407 |
| DISP_REG(DISP_HORZ_RAM_ADDR_POS_2_ADDR) |
| #define DISP_VERT_RAM_ADDR_POS_1_ADDR 0x408 |
| DISP_REG(DISP_VERT_RAM_ADDR_POS_1_ADDR) |
| #define DISP_VERT_RAM_ADDR_POS_2_ADDR 0x409 |
| DISP_REG(DISP_VERT_RAM_ADDR_POS_2_ADDR) |
| #define DISP_TMD_700_ADDR 0x700 /* 0x700 */ |
| DISP_REG(DISP_TMD_700_ADDR) |
| #define DISP_TMD_015_ADDR 0x015 /* 0x700 */ |
| DISP_REG(DISP_TMD_015_ADDR) |
| #define DISP_TMD_305_ADDR 0x305 /* 0x700 */ |
| DISP_REG(DISP_TMD_305_ADDR) |
| |
| /* |
| * TMD QVGA Bit Definations |
| */ |
| |
| #define DISP_BIT_IB15 0x8000 |
| #define DISP_BIT_IB14 0x4000 |
| #define DISP_BIT_IB13 0x2000 |
| #define DISP_BIT_IB12 0x1000 |
| #define DISP_BIT_IB11 0x0800 |
| #define DISP_BIT_IB10 0x0400 |
| #define DISP_BIT_IB09 0x0200 |
| #define DISP_BIT_IB08 0x0100 |
| #define DISP_BIT_IB07 0x0080 |
| #define DISP_BIT_IB06 0x0040 |
| #define DISP_BIT_IB05 0x0020 |
| #define DISP_BIT_IB04 0x0010 |
| #define DISP_BIT_IB03 0x0008 |
| #define DISP_BIT_IB02 0x0004 |
| #define DISP_BIT_IB01 0x0002 |
| #define DISP_BIT_IB00 0x0001 |
| /* |
| * Display Control |
| * DISP_START_OSCILLATION_ADDR Start Oscillation |
| * DISP_DRIVER_OUTPUT_CTL_ADDR Driver Output Control |
| */ |
| #define DISP_BITMASK_SS DISP_BIT_IB08 |
| #define DISP_BITMASK_NL5 DISP_BIT_IB05 |
| #define DISP_BITMASK_NL4 DISP_BIT_IB04 |
| #define DISP_BITMASK_NL3 DISP_BIT_IB03 |
| #define DISP_BITMASK_NL2 DISP_BIT_IB02 |
| #define DISP_BITMASK_NL1 DISP_BIT_IB01 |
| #define DISP_BITMASK_NL0 DISP_BIT_IB00 |
| /* DISP_LCD_DRIVING_SIG_ADDR LCD Driving Signal Setting */ |
| #define DISP_BITMASK_BC DISP_BIT_IB09 |
| /* DISP_ENTRY_MODE_ADDR Entry Mode */ |
| #define DISP_BITMASK_TRI DISP_BIT_IB15 |
| #define DISP_BITMASK_DFM1 DISP_BIT_IB14 |
| #define DISP_BITMASK_DFM0 DISP_BIT_IB13 |
| #define DISP_BITMASK_BGR DISP_BIT_IB12 |
| #define DISP_BITMASK_HWM0 DISP_BIT_IB08 |
| #define DISP_BITMASK_ID1 DISP_BIT_IB05 |
| #define DISP_BITMASK_ID0 DISP_BIT_IB04 |
| #define DISP_BITMASK_AM DISP_BIT_IB03 |
| /* DISP_DISPLAY_CTL_1_ADDR Display Control (1) */ |
| #define DISP_BITMASK_COL1 DISP_BIT_IB15 |
| #define DISP_BITMASK_COL0 DISP_BIT_IB14 |
| #define DISP_BITMASK_VLE2 DISP_BIT_IB10 |
| #define DISP_BITMASK_VLE1 DISP_BIT_IB09 |
| #define DISP_BITMASK_SPT DISP_BIT_IB08 |
| #define DISP_BITMASK_PT1 DISP_BIT_IB07 |
| #define DISP_BITMASK_PT0 DISP_BIT_IB06 |
| #define DISP_BITMASK_REV DISP_BIT_IB02 |
| /* DISP_DISPLAY_CTL_2_ADDR Display Control (2) */ |
| #define DISP_BITMASK_FP3 DISP_BIT_IB11 |
| #define DISP_BITMASK_FP2 DISP_BIT_IB10 |
| #define DISP_BITMASK_FP1 DISP_BIT_IB09 |
| #define DISP_BITMASK_FP0 DISP_BIT_IB08 |
| #define DISP_BITMASK_BP3 DISP_BIT_IB03 |
| #define DISP_BITMASK_BP2 DISP_BIT_IB02 |
| #define DISP_BITMASK_BP1 DISP_BIT_IB01 |
| #define DISP_BITMASK_BP0 DISP_BIT_IB00 |
| /* DISP_POWER_SUPPLY_INTF_ADDR Power Supply IC Interface Control */ |
| #define DISP_BITMASK_CSE DISP_BIT_IB12 |
| #define DISP_BITMASK_TE DISP_BIT_IB08 |
| #define DISP_BITMASK_IX3 DISP_BIT_IB03 |
| #define DISP_BITMASK_IX2 DISP_BIT_IB02 |
| #define DISP_BITMASK_IX1 DISP_BIT_IB01 |
| #define DISP_BITMASK_IX0 DISP_BIT_IB00 |
| /* DISP_EXT_DISPLAY_CTL_1_ADDR External Display Interface Control (1) */ |
| #define DISP_BITMASK_RM DISP_BIT_IB08 |
| #define DISP_BITMASK_DM1 DISP_BIT_IB05 |
| #define DISP_BITMASK_DM0 DISP_BIT_IB04 |
| #define DISP_BITMASK_RIM1 DISP_BIT_IB01 |
| #define DISP_BITMASK_RIM0 DISP_BIT_IB00 |
| /* DISP_FRAME_CYCLE_CTL_ADDR Frame Frequency Adjustment Control */ |
| #define DISP_BITMASK_DIVI1 DISP_BIT_IB09 |
| #define DISP_BITMASK_DIVI0 DISP_BIT_IB08 |
| #define DISP_BITMASK_RTNI4 DISP_BIT_IB04 |
| #define DISP_BITMASK_RTNI3 DISP_BIT_IB03 |
| #define DISP_BITMASK_RTNI2 DISP_BIT_IB02 |
| #define DISP_BITMASK_RTNI1 DISP_BIT_IB01 |
| #define DISP_BITMASK_RTNI0 DISP_BIT_IB00 |
| /* DISP_EXT_DISPLAY_CTL_2_ADDR External Display Interface Control (2) */ |
| #define DISP_BITMASK_DIVE1 DISP_BIT_IB09 |
| #define DISP_BITMASK_DIVE0 DISP_BIT_IB08 |
| #define DISP_BITMASK_RTNE7 DISP_BIT_IB07 |
| #define DISP_BITMASK_RTNE6 DISP_BIT_IB06 |
| #define DISP_BITMASK_RTNE5 DISP_BIT_IB05 |
| #define DISP_BITMASK_RTNE4 DISP_BIT_IB04 |
| #define DISP_BITMASK_RTNE3 DISP_BIT_IB03 |
| #define DISP_BITMASK_RTNE2 DISP_BIT_IB02 |
| #define DISP_BITMASK_RTNE1 DISP_BIT_IB01 |
| #define DISP_BITMASK_RTNE0 DISP_BIT_IB00 |
| /* DISP_EXT_DISPLAY_CTL_3_ADDR External Display Interface Control (3) */ |
| #define DISP_BITMASK_VSPL DISP_BIT_IB04 |
| #define DISP_BITMASK_HSPL DISP_BIT_IB03 |
| #define DISP_BITMASK_VPL DISP_BIT_IB02 |
| #define DISP_BITMASK_EPL DISP_BIT_IB01 |
| #define DISP_BITMASK_DPL DISP_BIT_IB00 |
| /* DISP_LTPS_CTL_1_ADDR LTPS Interface Control (1) */ |
| #define DISP_BITMASK_CLWI3 DISP_BIT_IB11 |
| #define DISP_BITMASK_CLWI2 DISP_BIT_IB10 |
| #define DISP_BITMASK_CLWI1 DISP_BIT_IB09 |
| #define DISP_BITMASK_CLWI0 DISP_BIT_IB08 |
| #define DISP_BITMASK_CLTI1 DISP_BIT_IB01 |
| #define DISP_BITMASK_CLTI0 DISP_BIT_IB00 |
| /* DISP_LTPS_CTL_2_ADDR LTPS Interface Control (2) */ |
| #define DISP_BITMASK_OEVBI1 DISP_BIT_IB09 |
| #define DISP_BITMASK_OEVBI0 DISP_BIT_IB08 |
| #define DISP_BITMASK_OEVFI1 DISP_BIT_IB01 |
| #define DISP_BITMASK_OEVFI0 DISP_BIT_IB00 |
| /* DISP_LTPS_CTL_3_ADDR LTPS Interface Control (3) */ |
| #define DISP_BITMASK_SHI1 DISP_BIT_IB01 |
| #define DISP_BITMASK_SHI0 DISP_BIT_IB00 |
| /* DISP_LTPS_CTL_4_ADDR LTPS Interface Control (4) */ |
| #define DISP_BITMASK_CLWE5 DISP_BIT_IB13 |
| #define DISP_BITMASK_CLWE4 DISP_BIT_IB12 |
| #define DISP_BITMASK_CLWE3 DISP_BIT_IB11 |
| #define DISP_BITMASK_CLWE2 DISP_BIT_IB10 |
| #define DISP_BITMASK_CLWE1 DISP_BIT_IB09 |
| #define DISP_BITMASK_CLWE0 DISP_BIT_IB08 |
| #define DISP_BITMASK_CLTE3 DISP_BIT_IB03 |
| #define DISP_BITMASK_CLTE2 DISP_BIT_IB02 |
| #define DISP_BITMASK_CLTE1 DISP_BIT_IB01 |
| #define DISP_BITMASK_CLTE0 DISP_BIT_IB00 |
| /* DISP_LTPS_CTL_5_ADDR LTPS Interface Control (5) */ |
| #define DISP_BITMASK_OEVBE3 DISP_BIT_IB11 |
| #define DISP_BITMASK_OEVBE2 DISP_BIT_IB10 |
| #define DISP_BITMASK_OEVBE1 DISP_BIT_IB09 |
| #define DISP_BITMASK_OEVBE0 DISP_BIT_IB08 |
| #define DISP_BITMASK_OEVFE3 DISP_BIT_IB03 |
| #define DISP_BITMASK_OEVFE2 DISP_BIT_IB02 |
| #define DISP_BITMASK_OEVFE1 DISP_BIT_IB01 |
| #define DISP_BITMASK_OEVFE0 DISP_BIT_IB00 |
| /* DISP_LTPS_CTL_6_ADDR LTPS Interface Control (6) */ |
| #define DISP_BITMASK_SHE3 DISP_BIT_IB03 |
| #define DISP_BITMASK_SHE2 DISP_BIT_IB02 |
| #define DISP_BITMASK_SHE1 DISP_BIT_IB01 |
| #define DISP_BITMASK_SHE0 DISP_BIT_IB00 |
| /* DISP_AMP_SETTING_ADDR Amplify Setting */ |
| #define DISP_BITMASK_ABSW1 DISP_BIT_IB01 |
| #define DISP_BITMASK_ABSW0 DISP_BIT_IB00 |
| /* DISP_MODE_SETTING_ADDR Mode Setting */ |
| #define DISP_BITMASK_DSTB DISP_BIT_IB02 |
| #define DISP_BITMASK_STB DISP_BIT_IB00 |
| /* DISP_POFF_LN_SETTING_ADDR Power Off Line Setting */ |
| #define DISP_BITMASK_POFH3 DISP_BIT_IB03 |
| #define DISP_BITMASK_POFH2 DISP_BIT_IB02 |
| #define DISP_BITMASK_POFH1 DISP_BIT_IB01 |
| #define DISP_BITMASK_POFH0 DISP_BIT_IB00 |
| |
| /* Power Contol */ |
| /* DISP_POWER_CTL_1_ADDR Power Control (1) */ |
| #define DISP_BITMASK_PO DISP_BIT_IB11 |
| #define DISP_BITMASK_VCD DISP_BIT_IB09 |
| #define DISP_BITMASK_VSC DISP_BIT_IB08 |
| #define DISP_BITMASK_CON DISP_BIT_IB07 |
| #define DISP_BITMASK_ASW1 DISP_BIT_IB06 |
| #define DISP_BITMASK_ASW0 DISP_BIT_IB05 |
| #define DISP_BITMASK_OEV DISP_BIT_IB04 |
| #define DISP_BITMASK_OEVE DISP_BIT_IB03 |
| #define DISP_BITMASK_FR DISP_BIT_IB02 |
| #define DISP_BITMASK_D1 DISP_BIT_IB01 |
| #define DISP_BITMASK_D0 DISP_BIT_IB00 |
| /* DISP_POWER_CTL_2_ADDR Power Control (2) */ |
| #define DISP_BITMASK_DC4 DISP_BIT_IB15 |
| #define DISP_BITMASK_DC3 DISP_BIT_IB14 |
| #define DISP_BITMASK_SAP2 DISP_BIT_IB13 |
| #define DISP_BITMASK_SAP1 DISP_BIT_IB12 |
| #define DISP_BITMASK_SAP0 DISP_BIT_IB11 |
| #define DISP_BITMASK_BT2 DISP_BIT_IB10 |
| #define DISP_BITMASK_BT1 DISP_BIT_IB09 |
| #define DISP_BITMASK_BT0 DISP_BIT_IB08 |
| #define DISP_BITMASK_DC2 DISP_BIT_IB07 |
| #define DISP_BITMASK_DC1 DISP_BIT_IB06 |
| #define DISP_BITMASK_DC0 DISP_BIT_IB05 |
| #define DISP_BITMASK_AP2 DISP_BIT_IB04 |
| #define DISP_BITMASK_AP1 DISP_BIT_IB03 |
| #define DISP_BITMASK_AP0 DISP_BIT_IB02 |
| /* DISP_POWER_CTL_3_ADDR Power Control (3) */ |
| #define DISP_BITMASK_VGL4 DISP_BIT_IB10 |
| #define DISP_BITMASK_VGL3 DISP_BIT_IB09 |
| #define DISP_BITMASK_VGL2 DISP_BIT_IB08 |
| #define DISP_BITMASK_VGL1 DISP_BIT_IB07 |
| #define DISP_BITMASK_VGL0 DISP_BIT_IB06 |
| #define DISP_BITMASK_VGH4 DISP_BIT_IB04 |
| #define DISP_BITMASK_VGH3 DISP_BIT_IB03 |
| #define DISP_BITMASK_VGH2 DISP_BIT_IB02 |
| #define DISP_BITMASK_VGH1 DISP_BIT_IB01 |
| #define DISP_BITMASK_VGH0 DISP_BIT_IB00 |
| /* DISP_POWER_CTL_4_ADDR Power Control (4) */ |
| #define DISP_BITMASK_VC2 DISP_BIT_IB02 |
| #define DISP_BITMASK_VC1 DISP_BIT_IB01 |
| #define DISP_BITMASK_VC0 DISP_BIT_IB00 |
| /* DISP_POWER_CTL_5_ADDR Power Control (5) */ |
| #define DISP_BITMASK_VRL3 DISP_BIT_IB11 |
| #define DISP_BITMASK_VRL2 DISP_BIT_IB10 |
| #define DISP_BITMASK_VRL1 DISP_BIT_IB09 |
| #define DISP_BITMASK_VRL0 DISP_BIT_IB08 |
| #define DISP_BITMASK_PON DISP_BIT_IB04 |
| #define DISP_BITMASK_VRH3 DISP_BIT_IB03 |
| #define DISP_BITMASK_VRH2 DISP_BIT_IB02 |
| #define DISP_BITMASK_VRH1 DISP_BIT_IB01 |
| #define DISP_BITMASK_VRH0 DISP_BIT_IB00 |
| /* DISP_POWER_CTL_6_ADDR Power Control (6) */ |
| #define DISP_BITMASK_VCOMG DISP_BIT_IB13 |
| #define DISP_BITMASK_VDV4 DISP_BIT_IB12 |
| #define DISP_BITMASK_VDV3 DISP_BIT_IB11 |
| #define DISP_BITMASK_VDV2 DISP_BIT_IB10 |
| #define DISP_BITMASK_VDV1 DISP_BIT_IB09 |
| #define DISP_BITMASK_VDV0 DISP_BIT_IB08 |
| #define DISP_BITMASK_VCM4 DISP_BIT_IB04 |
| #define DISP_BITMASK_VCM3 DISP_BIT_IB03 |
| #define DISP_BITMASK_VCM2 DISP_BIT_IB02 |
| #define DISP_BITMASK_VCM1 DISP_BIT_IB01 |
| #define DISP_BITMASK_VCM0 DISP_BIT_IB00 |
| /* RAM Access */ |
| /* DISP_RAM_ADDR_SET_1_ADDR RAM Address Set (1) */ |
| #define DISP_BITMASK_AD7 DISP_BIT_IB07 |
| #define DISP_BITMASK_AD6 DISP_BIT_IB06 |
| #define DISP_BITMASK_AD5 DISP_BIT_IB05 |
| #define DISP_BITMASK_AD4 DISP_BIT_IB04 |
| #define DISP_BITMASK_AD3 DISP_BIT_IB03 |
| #define DISP_BITMASK_AD2 DISP_BIT_IB02 |
| #define DISP_BITMASK_AD1 DISP_BIT_IB01 |
| #define DISP_BITMASK_AD0 DISP_BIT_IB00 |
| /* DISP_RAM_ADDR_SET_2_ADDR RAM Address Set (2) */ |
| #define DISP_BITMASK_AD16 DISP_BIT_IB08 |
| #define DISP_BITMASK_AD15 DISP_BIT_IB07 |
| #define DISP_BITMASK_AD14 DISP_BIT_IB06 |
| #define DISP_BITMASK_AD13 DISP_BIT_IB05 |
| #define DISP_BITMASK_AD12 DISP_BIT_IB04 |
| #define DISP_BITMASK_AD11 DISP_BIT_IB03 |
| #define DISP_BITMASK_AD10 DISP_BIT_IB02 |
| #define DISP_BITMASK_AD9 DISP_BIT_IB01 |
| #define DISP_BITMASK_AD8 DISP_BIT_IB00 |
| /* |
| * DISP_CMD_RAMWR RAM Data Read/Write |
| * Use Data Bit Configuration |
| */ |
| /* DISP_RAM_DATA_MASK_1_ADDR RAM Write Data Mask (1) */ |
| #define DISP_BITMASK_WM11 DISP_BIT_IB13 |
| #define DISP_BITMASK_WM10 DISP_BIT_IB12 |
| #define DISP_BITMASK_WM9 DISP_BIT_IB11 |
| #define DISP_BITMASK_WM8 DISP_BIT_IB10 |
| #define DISP_BITMASK_WM7 DISP_BIT_IB09 |
| #define DISP_BITMASK_WM6 DISP_BIT_IB08 |
| #define DISP_BITMASK_WM5 DISP_BIT_IB05 |
| #define DISP_BITMASK_WM4 DISP_BIT_IB04 |
| #define DISP_BITMASK_WM3 DISP_BIT_IB03 |
| #define DISP_BITMASK_WM2 DISP_BIT_IB02 |
| #define DISP_BITMASK_WM1 DISP_BIT_IB01 |
| #define DISP_BITMASK_WM0 DISP_BIT_IB00 |
| /* DISP_RAM_DATA_MASK_2_ADDR RAM Write Data Mask (2) */ |
| #define DISP_BITMASK_WM17 DISP_BIT_IB05 |
| #define DISP_BITMASK_WM16 DISP_BIT_IB04 |
| #define DISP_BITMASK_WM15 DISP_BIT_IB03 |
| #define DISP_BITMASK_WM14 DISP_BIT_IB02 |
| #define DISP_BITMASK_WM13 DISP_BIT_IB01 |
| #define DISP_BITMASK_WM12 DISP_BIT_IB00 |
| /*Gamma Control */ |
| /* DISP_GAMMA_CONTROL_1_ADDR Gamma Control (1) */ |
| #define DISP_BITMASK_PKP12 DISP_BIT_IB10 |
| #define DISP_BITMASK_PKP11 DISP_BIT_IB08 |
| #define DISP_BITMASK_PKP10 DISP_BIT_IB09 |
| #define DISP_BITMASK_PKP02 DISP_BIT_IB02 |
| #define DISP_BITMASK_PKP01 DISP_BIT_IB01 |
| #define DISP_BITMASK_PKP00 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_2_ADDR Gamma Control (2) */ |
| #define DISP_BITMASK_PKP32 DISP_BIT_IB10 |
| #define DISP_BITMASK_PKP31 DISP_BIT_IB09 |
| #define DISP_BITMASK_PKP30 DISP_BIT_IB08 |
| #define DISP_BITMASK_PKP22 DISP_BIT_IB02 |
| #define DISP_BITMASK_PKP21 DISP_BIT_IB01 |
| #define DISP_BITMASK_PKP20 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_3_ADDR Gamma Control (3) */ |
| #define DISP_BITMASK_PKP52 DISP_BIT_IB10 |
| #define DISP_BITMASK_PKP51 DISP_BIT_IB09 |
| #define DISP_BITMASK_PKP50 DISP_BIT_IB08 |
| #define DISP_BITMASK_PKP42 DISP_BIT_IB02 |
| #define DISP_BITMASK_PKP41 DISP_BIT_IB01 |
| #define DISP_BITMASK_PKP40 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_4_ADDR Gamma Control (4) */ |
| #define DISP_BITMASK_PRP12 DISP_BIT_IB10 |
| #define DISP_BITMASK_PRP11 DISP_BIT_IB08 |
| #define DISP_BITMASK_PRP10 DISP_BIT_IB09 |
| #define DISP_BITMASK_PRP02 DISP_BIT_IB02 |
| #define DISP_BITMASK_PRP01 DISP_BIT_IB01 |
| #define DISP_BITMASK_PRP00 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_5_ADDR Gamma Control (5) */ |
| #define DISP_BITMASK_VRP14 DISP_BIT_IB12 |
| #define DISP_BITMASK_VRP13 DISP_BIT_IB11 |
| #define DISP_BITMASK_VRP12 DISP_BIT_IB10 |
| #define DISP_BITMASK_VRP11 DISP_BIT_IB08 |
| #define DISP_BITMASK_VRP10 DISP_BIT_IB09 |
| #define DISP_BITMASK_VRP03 DISP_BIT_IB03 |
| #define DISP_BITMASK_VRP02 DISP_BIT_IB02 |
| #define DISP_BITMASK_VRP01 DISP_BIT_IB01 |
| #define DISP_BITMASK_VRP00 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_6_ADDR Gamma Control (6) */ |
| #define DISP_BITMASK_PKN12 DISP_BIT_IB10 |
| #define DISP_BITMASK_PKN11 DISP_BIT_IB08 |
| #define DISP_BITMASK_PKN10 DISP_BIT_IB09 |
| #define DISP_BITMASK_PKN02 DISP_BIT_IB02 |
| #define DISP_BITMASK_PKN01 DISP_BIT_IB01 |
| #define DISP_BITMASK_PKN00 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_7_ADDR Gamma Control (7) */ |
| #define DISP_BITMASK_PKN32 DISP_BIT_IB10 |
| #define DISP_BITMASK_PKN31 DISP_BIT_IB08 |
| #define DISP_BITMASK_PKN30 DISP_BIT_IB09 |
| #define DISP_BITMASK_PKN22 DISP_BIT_IB02 |
| #define DISP_BITMASK_PKN21 DISP_BIT_IB01 |
| #define DISP_BITMASK_PKN20 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_8_ADDR Gamma Control (8) */ |
| #define DISP_BITMASK_PKN52 DISP_BIT_IB10 |
| #define DISP_BITMASK_PKN51 DISP_BIT_IB08 |
| #define DISP_BITMASK_PKN50 DISP_BIT_IB09 |
| #define DISP_BITMASK_PKN42 DISP_BIT_IB02 |
| #define DISP_BITMASK_PKN41 DISP_BIT_IB01 |
| #define DISP_BITMASK_PKN40 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_9_ADDR Gamma Control (9) */ |
| #define DISP_BITMASK_PRN12 DISP_BIT_IB10 |
| #define DISP_BITMASK_PRN11 DISP_BIT_IB08 |
| #define DISP_BITMASK_PRN10 DISP_BIT_IB09 |
| #define DISP_BITMASK_PRN02 DISP_BIT_IB02 |
| #define DISP_BITMASK_PRN01 DISP_BIT_IB01 |
| #define DISP_BITMASK_PRN00 DISP_BIT_IB00 |
| /* DISP_GAMMA_CONTROL_10_ADDR Gamma Control (10) */ |
| #define DISP_BITMASK_VRN14 DISP_BIT_IB12 |
| #define DISP_BITMASK_VRN13 DISP_BIT_IB11 |
| #define DISP_BITMASK_VRN12 DISP_BIT_IB10 |
| #define DISP_BITMASK_VRN11 DISP_BIT_IB08 |
| #define DISP_BITMASK_VRN10 DISP_BIT_IB09 |
| #define DISP_BITMASK_VRN03 DISP_BIT_IB03 |
| #define DISP_BITMASK_VRN02 DISP_BIT_IB02 |
| #define DISP_BITMASK_VRN01 DISP_BIT_IB01 |
| #define DISP_BITMASK_VRN00 DISP_BIT_IB00 |
| /* Coordinate Control */ |
| /* DISP_VERT_SCROLL_CTL_1_ADDR Vertical Scroll Control (1) */ |
| #define DISP_BITMASK_VL18 DISP_BIT_IB08 |
| #define DISP_BITMASK_VL17 DISP_BIT_IB07 |
| #define DISP_BITMASK_VL16 DISP_BIT_IB06 |
| #define DISP_BITMASK_VL15 DISP_BIT_IB05 |
| #define DISP_BITMASK_VL14 DISP_BIT_IB04 |
| #define DISP_BITMASK_VL13 DISP_BIT_IB03 |
| #define DISP_BITMASK_VL12 DISP_BIT_IB02 |
| #define DISP_BITMASK_VL11 DISP_BIT_IB01 |
| #define DISP_BITMASK_VL10 DISP_BIT_IB00 |
| /* DISP_VERT_SCROLL_CTL_2_ADDR Vertical Scroll Control (2) */ |
| #define DISP_BITMASK_VL28 DISP_BIT_IB08 |
| #define DISP_BITMASK_VL27 DISP_BIT_IB07 |
| #define DISP_BITMASK_VL26 DISP_BIT_IB06 |
| #define DISP_BITMASK_VL25 DISP_BIT_IB05 |
| #define DISP_BITMASK_VL24 DISP_BIT_IB04 |
| #define DISP_BITMASK_VL23 DISP_BIT_IB03 |
| #define DISP_BITMASK_VL22 DISP_BIT_IB02 |
| #define DISP_BITMASK_VL21 DISP_BIT_IB01 |
| #define DISP_BITMASK_VL20 DISP_BIT_IB00 |
| /* DISP_SCREEN_1_DRV_POS_1_ADDR First Screen Driving Position (1) */ |
| #define DISP_BITMASK_SS18 DISP_BIT_IB08 |
| #define DISP_BITMASK_SS17 DISP_BIT_IB07 |
| #define DISP_BITMASK_SS16 DISP_BIT_IB06 |
| #define DISP_BITMASK_SS15 DISP_BIT_IB05 |
| #define DISP_BITMASK_SS14 DISP_BIT_IB04 |
| #define DISP_BITMASK_SS13 DISP_BIT_IB03 |
| #define DISP_BITMASK_SS12 DISP_BIT_IB02 |
| #define DISP_BITMASK_SS11 DISP_BIT_IB01 |
| #define DISP_BITMASK_SS10 DISP_BIT_IB00 |
| /* DISP_SCREEN_1_DRV_POS_2_ADDR First Screen Driving Position (2) */ |
| #define DISP_BITMASK_SE18 DISP_BIT_IB08 |
| #define DISP_BITMASK_SE17 DISP_BIT_IB07 |
| #define DISP_BITMASK_SE16 DISP_BIT_IB06 |
| #define DISP_BITMASK_SE15 DISP_BIT_IB05 |
| #define DISP_BITMASK_SE14 DISP_BIT_IB04 |
| #define DISP_BITMASK_SE13 DISP_BIT_IB03 |
| #define DISP_BITMASK_SE12 DISP_BIT_IB02 |
| #define DISP_BITMASK_SE11 DISP_BIT_IB01 |
| #define DISP_BITMASK_SE10 DISP_BIT_IB00 |
| /* DISP_SCREEN_2_DRV_POS_1_ADDR Second Screen Driving Position (1) */ |
| #define DISP_BITMASK_SS28 DISP_BIT_IB08 |
| #define DISP_BITMASK_SS27 DISP_BIT_IB07 |
| #define DISP_BITMASK_SS26 DISP_BIT_IB06 |
| #define DISP_BITMASK_SS25 DISP_BIT_IB05 |
| #define DISP_BITMASK_SS24 DISP_BIT_IB04 |
| #define DISP_BITMASK_SS23 DISP_BIT_IB03 |
| #define DISP_BITMASK_SS22 DISP_BIT_IB02 |
| #define DISP_BITMASK_SS21 DISP_BIT_IB01 |
| #define DISP_BITMASK_SS20 DISP_BIT_IB00 |
| /* DISP_SCREEN_3_DRV_POS_2_ADDR Second Screen Driving Position (2) */ |
| #define DISP_BITMASK_SE28 DISP_BIT_IB08 |
| #define DISP_BITMASK_SE27 DISP_BIT_IB07 |
| #define DISP_BITMASK_SE26 DISP_BIT_IB06 |
| #define DISP_BITMASK_SE25 DISP_BIT_IB05 |
| #define DISP_BITMASK_SE24 DISP_BIT_IB04 |
| #define DISP_BITMASK_SE23 DISP_BIT_IB03 |
| #define DISP_BITMASK_SE22 DISP_BIT_IB02 |
| #define DISP_BITMASK_SE21 DISP_BIT_IB01 |
| #define DISP_BITMASK_SE20 DISP_BIT_IB00 |
| /* DISP_HORZ_RAM_ADDR_POS_1_ADDR Horizontal RAM Address Position (1) */ |
| #define DISP_BITMASK_HSA7 DISP_BIT_IB07 |
| #define DISP_BITMASK_HSA6 DISP_BIT_IB06 |
| #define DISP_BITMASK_HSA5 DISP_BIT_IB05 |
| #define DISP_BITMASK_HSA4 DISP_BIT_IB04 |
| #define DISP_BITMASK_HSA3 DISP_BIT_IB03 |
| #define DISP_BITMASK_HSA2 DISP_BIT_IB02 |
| #define DISP_BITMASK_HSA1 DISP_BIT_IB01 |
| #define DISP_BITMASK_HSA0 DISP_BIT_IB00 |
| /* DISP_HORZ_RAM_ADDR_POS_2_ADDR Horizontal RAM Address Position (2) */ |
| #define DISP_BITMASK_HEA7 DISP_BIT_IB07 |
| #define DISP_BITMASK_HEA6 DISP_BIT_IB06 |
| #define DISP_BITMASK_HEA5 DISP_BIT_IB05 |
| #define DISP_BITMASK_HEA4 DISP_BIT_IB04 |
| #define DISP_BITMASK_HEA3 DISP_BIT_IB03 |
| #define DISP_BITMASK_HEA2 DISP_BIT_IB02 |
| #define DISP_BITMASK_HEA1 DISP_BIT_IB01 |
| #define DISP_BITMASK_HEA0 DISP_BIT_IB00 |
| /* DISP_VERT_RAM_ADDR_POS_1_ADDR Vertical RAM Address Position (1) */ |
| #define DISP_BITMASK_VSA8 DISP_BIT_IB08 |
| #define DISP_BITMASK_VSA7 DISP_BIT_IB07 |
| #define DISP_BITMASK_VSA6 DISP_BIT_IB06 |
| #define DISP_BITMASK_VSA5 DISP_BIT_IB05 |
| #define DISP_BITMASK_VSA4 DISP_BIT_IB04 |
| #define DISP_BITMASK_VSA3 DISP_BIT_IB03 |
| #define DISP_BITMASK_VSA2 DISP_BIT_IB02 |
| #define DISP_BITMASK_VSA1 DISP_BIT_IB01 |
| #define DISP_BITMASK_VSA0 DISP_BIT_IB00 |
| /* DISP_VERT_RAM_ADDR_POS_2_ADDR Vertical RAM Address Position (2) */ |
| #define DISP_BITMASK_VEA8 DISP_BIT_IB08 |
| #define DISP_BITMASK_VEA7 DISP_BIT_IB07 |
| #define DISP_BITMASK_VEA6 DISP_BIT_IB06 |
| #define DISP_BITMASK_VEA5 DISP_BIT_IB05 |
| #define DISP_BITMASK_VEA4 DISP_BIT_IB04 |
| #define DISP_BITMASK_VEA3 DISP_BIT_IB03 |
| #define DISP_BITMASK_VEA2 DISP_BIT_IB02 |
| #define DISP_BITMASK_VEA1 DISP_BIT_IB01 |
| #define DISP_BITMASK_VEA0 DISP_BIT_IB00 |
| static word disp_area_start_row; |
| static word disp_area_end_row; |
| static boolean disp_initialized = FALSE; |
| /* For some reason the contrast set at init time is not good. Need to do |
| * it again |
| */ |
| static boolean display_on = FALSE; |
| |
| static uint32 tmd20qvga_lcd_rev; |
| uint16 tmd20qvga_panel_offset; |
| |
| #ifdef DISP_DEVICE_8BPP |
| static word convert_8_to_16_tbl[256] = { |
| 0x0000, 0x2000, 0x4000, 0x6000, 0x8000, 0xA000, 0xC000, 0xE000, |
| 0x0100, 0x2100, 0x4100, 0x6100, 0x8100, 0xA100, 0xC100, 0xE100, |
| 0x0200, 0x2200, 0x4200, 0x6200, 0x8200, 0xA200, 0xC200, 0xE200, |
| 0x0300, 0x2300, 0x4300, 0x6300, 0x8300, 0xA300, 0xC300, 0xE300, |
| 0x0400, 0x2400, 0x4400, 0x6400, 0x8400, 0xA400, 0xC400, 0xE400, |
| 0x0500, 0x2500, 0x4500, 0x6500, 0x8500, 0xA500, 0xC500, 0xE500, |
| 0x0600, 0x2600, 0x4600, 0x6600, 0x8600, 0xA600, 0xC600, 0xE600, |
| 0x0700, 0x2700, 0x4700, 0x6700, 0x8700, 0xA700, 0xC700, 0xE700, |
| 0x0008, 0x2008, 0x4008, 0x6008, 0x8008, 0xA008, 0xC008, 0xE008, |
| 0x0108, 0x2108, 0x4108, 0x6108, 0x8108, 0xA108, 0xC108, 0xE108, |
| 0x0208, 0x2208, 0x4208, 0x6208, 0x8208, 0xA208, 0xC208, 0xE208, |
| 0x0308, 0x2308, 0x4308, 0x6308, 0x8308, 0xA308, 0xC308, 0xE308, |
| 0x0408, 0x2408, 0x4408, 0x6408, 0x8408, 0xA408, 0xC408, 0xE408, |
| 0x0508, 0x2508, 0x4508, 0x6508, 0x8508, 0xA508, 0xC508, 0xE508, |
| 0x0608, 0x2608, 0x4608, 0x6608, 0x8608, 0xA608, 0xC608, 0xE608, |
| 0x0708, 0x2708, 0x4708, 0x6708, 0x8708, 0xA708, 0xC708, 0xE708, |
| 0x0010, 0x2010, 0x4010, 0x6010, 0x8010, 0xA010, 0xC010, 0xE010, |
| 0x0110, 0x2110, 0x4110, 0x6110, 0x8110, 0xA110, 0xC110, 0xE110, |
| 0x0210, 0x2210, 0x4210, 0x6210, 0x8210, 0xA210, 0xC210, 0xE210, |
| 0x0310, 0x2310, 0x4310, 0x6310, 0x8310, 0xA310, 0xC310, 0xE310, |
| 0x0410, 0x2410, 0x4410, 0x6410, 0x8410, 0xA410, 0xC410, 0xE410, |
| 0x0510, 0x2510, 0x4510, 0x6510, 0x8510, 0xA510, 0xC510, 0xE510, |
| 0x0610, 0x2610, 0x4610, 0x6610, 0x8610, 0xA610, 0xC610, 0xE610, |
| 0x0710, 0x2710, 0x4710, 0x6710, 0x8710, 0xA710, 0xC710, 0xE710, |
| 0x0018, 0x2018, 0x4018, 0x6018, 0x8018, 0xA018, 0xC018, 0xE018, |
| 0x0118, 0x2118, 0x4118, 0x6118, 0x8118, 0xA118, 0xC118, 0xE118, |
| 0x0218, 0x2218, 0x4218, 0x6218, 0x8218, 0xA218, 0xC218, 0xE218, |
| 0x0318, 0x2318, 0x4318, 0x6318, 0x8318, 0xA318, 0xC318, 0xE318, |
| 0x0418, 0x2418, 0x4418, 0x6418, 0x8418, 0xA418, 0xC418, 0xE418, |
| 0x0518, 0x2518, 0x4518, 0x6518, 0x8518, 0xA518, 0xC518, 0xE518, |
| 0x0618, 0x2618, 0x4618, 0x6618, 0x8618, 0xA618, 0xC618, 0xE618, |
| 0x0718, 0x2718, 0x4718, 0x6718, 0x8718, 0xA718, 0xC718, 0xE718 |
| }; |
| #endif /* DISP_DEVICE_8BPP */ |
| |
| static void tmd20qvga_disp_set_rect(int x, int y, int xres, int yres); |
| static void tmd20qvga_disp_init(struct platform_device *pdev); |
| static void tmd20qvga_disp_set_contrast(void); |
| static void tmd20qvga_disp_set_display_area(word start_row, word end_row); |
| static int tmd20qvga_disp_off(struct platform_device *pdev); |
| static int tmd20qvga_disp_on(struct platform_device *pdev); |
| static void tmd20qvga_set_revId(int); |
| |
| /* future use */ |
| void tmd20qvga_disp_clear_screen_area(word start_row, word end_row, |
| word start_column, word end_column); |
| |
| static void tmd20qvga_set_revId(int id) |
| { |
| |
| tmd20qvga_lcd_rev = id; |
| |
| if (tmd20qvga_lcd_rev == 1) |
| tmd20qvga_panel_offset = 0x10; |
| else |
| tmd20qvga_panel_offset = 0; |
| } |
| |
| static void tmd20qvga_disp_init(struct platform_device *pdev) |
| { |
| struct msm_fb_data_type *mfd; |
| |
| if (disp_initialized) |
| return; |
| |
| mfd = platform_get_drvdata(pdev); |
| |
| DISP_CMD_PORT = mfd->cmd_port; |
| DISP_DATA_PORT = mfd->data_port; |
| |
| #ifdef TMD20QVGA_LCD_18BPP |
| tmd20qvga_set_revId(2); |
| #else |
| tmd20qvga_set_revId(1); |
| #endif |
| |
| disp_initialized = TRUE; |
| tmd20qvga_disp_set_contrast(); |
| tmd20qvga_disp_set_display_area(0, QVGA_HEIGHT - 1); |
| } |
| |
| static void tmd20qvga_disp_set_rect(int x, int y, int xres, int yres) |
| { |
| if (!disp_initialized) |
| return; |
| |
| DISP_SET_RECT(y, y + yres - 1, x, x + xres - 1); |
| |
| DISP_CMD_OUT(DISP_CMD_RAMWR); |
| } |
| |
| static void tmd20qvga_disp_set_display_area(word start_row, word end_row) |
| { |
| word start_driving = start_row; |
| word end_driving = end_row; |
| |
| if (!disp_initialized) |
| return; |
| |
| /* Range checking |
| */ |
| if (end_driving >= QVGA_HEIGHT) |
| end_driving = QVGA_HEIGHT - 1; |
| if (start_driving > end_driving) { |
| /* Probably Backwards Switch */ |
| start_driving = end_driving; |
| end_driving = start_row; /* Has not changed */ |
| if (end_driving >= QVGA_HEIGHT) |
| end_driving = QVGA_HEIGHT - 1; |
| } |
| |
| if ((start_driving == disp_area_start_row) |
| && (end_driving == disp_area_end_row)) |
| return; |
| |
| disp_area_start_row = start_driving; |
| disp_area_end_row = end_driving; |
| |
| DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_1_ADDR, |
| DISP_VAL_IF(start_driving & 0x100, |
| DISP_BITMASK_SS18) | |
| DISP_VAL_IF(start_driving & 0x080, |
| DISP_BITMASK_SS17) | |
| DISP_VAL_IF(start_driving & 0x040, |
| DISP_BITMASK_SS16) | |
| DISP_VAL_IF(start_driving & 0x020, |
| DISP_BITMASK_SS15) | |
| DISP_VAL_IF(start_driving & 0x010, |
| DISP_BITMASK_SS14) | |
| DISP_VAL_IF(start_driving & 0x008, |
| DISP_BITMASK_SS13) | |
| DISP_VAL_IF(start_driving & 0x004, |
| DISP_BITMASK_SS12) | |
| DISP_VAL_IF(start_driving & 0x002, |
| DISP_BITMASK_SS11) | |
| DISP_VAL_IF(start_driving & 0x001, DISP_BITMASK_SS10)); |
| |
| DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_2_ADDR, |
| DISP_VAL_IF(end_driving & 0x100, DISP_BITMASK_SE18) | |
| DISP_VAL_IF(end_driving & 0x080, DISP_BITMASK_SE17) | |
| DISP_VAL_IF(end_driving & 0x040, DISP_BITMASK_SE16) | |
| DISP_VAL_IF(end_driving & 0x020, DISP_BITMASK_SE15) | |
| DISP_VAL_IF(end_driving & 0x010, DISP_BITMASK_SE14) | |
| DISP_VAL_IF(end_driving & 0x008, DISP_BITMASK_SE13) | |
| DISP_VAL_IF(end_driving & 0x004, DISP_BITMASK_SE12) | |
| DISP_VAL_IF(end_driving & 0x002, DISP_BITMASK_SE11) | |
| DISP_VAL_IF(end_driving & 0x001, DISP_BITMASK_SE10)); |
| } |
| |
| static int tmd20qvga_disp_off(struct platform_device *pdev) |
| { |
| if (!disp_initialized) |
| tmd20qvga_disp_init(pdev); |
| |
| if (display_on) { |
| if (tmd20qvga_lcd_rev == 2) { |
| DISP_WRITE_OUT(DISP_POFF_LN_SETTING_ADDR, 0x000A); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xFFEE); |
| WAIT_MSEC(40); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xF812); |
| WAIT_MSEC(40); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xE811); |
| WAIT_MSEC(40); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xC011); |
| WAIT_MSEC(40); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x4011); |
| WAIT_MSEC(20); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0010); |
| |
| } else { |
| DISP_WRITE_OUT(DISP_POFF_LN_SETTING_ADDR, 0x000F); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0BFE); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100); |
| WAIT_MSEC(40); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0BED); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100); |
| WAIT_MSEC(40); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x00CD); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100); |
| WAIT_MSEC(20); |
| DISP_WRITE_OUT(DISP_START_OSCILLATION_ADDR, 0x0); |
| } |
| |
| DISP_WRITE_OUT(DISP_MODE_SETTING_ADDR, 0x0004); |
| DISP_WRITE_OUT(DISP_MODE_SETTING_ADDR, 0x0000); |
| |
| display_on = FALSE; |
| } |
| |
| return 0; |
| } |
| |
| static int tmd20qvga_disp_on(struct platform_device *pdev) |
| { |
| if (!disp_initialized) |
| tmd20qvga_disp_init(pdev); |
| |
| if (!display_on) { |
| /* Deep Stand-by -> Stand-by */ |
| DISP_CMD_OUT(DISP_START_OSCILLATION_ADDR); |
| WAIT_MSEC(1); |
| DISP_CMD_OUT(DISP_START_OSCILLATION_ADDR); |
| WAIT_MSEC(1); |
| DISP_CMD_OUT(DISP_START_OSCILLATION_ADDR); |
| WAIT_MSEC(1); |
| |
| /* OFF -> Deep Stan-By -> Stand-by */ |
| /* let's change the state from "Stand-by" to "Sleep" */ |
| DISP_WRITE_OUT(DISP_MODE_SETTING_ADDR, 0x0005); |
| WAIT_MSEC(1); |
| |
| /* Sleep -> Displaying */ |
| DISP_WRITE_OUT(DISP_START_OSCILLATION_ADDR, 0x0001); |
| DISP_WRITE_OUT(DISP_DRIVER_OUTPUT_CTL_ADDR, 0x0127); |
| DISP_WRITE_OUT(DISP_LCD_DRIVING_SIG_ADDR, 0x200); |
| /* fast write mode */ |
| DISP_WRITE_OUT(DISP_ENTRY_MODE_ADDR, 0x0130); |
| if (tmd20qvga_lcd_rev == 2) |
| DISP_WRITE_OUT(DISP_TMD_700_ADDR, 0x0003); |
| /* back porch = 14 + front porch = 2 --> 16 lines */ |
| if (tmd20qvga_lcd_rev == 2) { |
| #ifdef TMD20QVGA_LCD_18BPP |
| /* 256k color */ |
| DISP_WRITE_OUT(DISP_DISPLAY_CTL_1_ADDR, 0x0000); |
| #else |
| /* 65k color */ |
| DISP_WRITE_OUT(DISP_DISPLAY_CTL_1_ADDR, 0x4000); |
| #endif |
| DISP_WRITE_OUT(DISP_DISPLAY_CTL_2_ADDR, 0x0302); |
| } else { |
| #ifdef TMD20QVGA_LCD_18BPP |
| /* 256k color */ |
| DISP_WRITE_OUT(DISP_DISPLAY_CTL_1_ADDR, 0x0004); |
| #else |
| /* 65k color */ |
| DISP_WRITE_OUT(DISP_DISPLAY_CTL_1_ADDR, 0x4004); |
| #endif |
| DISP_WRITE_OUT(DISP_DISPLAY_CTL_2_ADDR, 0x020E); |
| } |
| /* 16 bit one transfer */ |
| if (tmd20qvga_lcd_rev == 2) { |
| DISP_WRITE_OUT(DISP_EXT_DISPLAY_CTL_1_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_FRAME_CYCLE_CTL_ADDR, 0x0010); |
| DISP_WRITE_OUT(DISP_LTPS_CTL_1_ADDR, 0x0302); |
| DISP_WRITE_OUT(DISP_LTPS_CTL_2_ADDR, 0x0102); |
| DISP_WRITE_OUT(DISP_LTPS_CTL_3_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_TMD_015_ADDR, 0x2000); |
| |
| DISP_WRITE_OUT(DISP_AMP_SETTING_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_1_ADDR, 0x0403); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_2_ADDR, 0x0304); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_3_ADDR, 0x0403); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_4_ADDR, 0x0303); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_5_ADDR, 0x0101); |
| DISP_WRITE_OUT(DISP_TMD_305_ADDR, 0); |
| |
| DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_1_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_2_ADDR, 0x013F); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_3_ADDR, 0x077D); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_4_ADDR, 0x0005); |
| DISP_WRITE_OUT(DISP_POWER_CTL_5_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_POWER_CTL_6_ADDR, 0x0015); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xC010); |
| WAIT_MSEC(1); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_2_ADDR, 0x0001); |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xFFFE); |
| WAIT_MSEC(60); |
| } else { |
| DISP_WRITE_OUT(DISP_EXT_DISPLAY_CTL_1_ADDR, 0x0001); |
| DISP_WRITE_OUT(DISP_FRAME_CYCLE_CTL_ADDR, 0x0010); |
| DISP_WRITE_OUT(DISP_LTPS_CTL_1_ADDR, 0x0301); |
| DISP_WRITE_OUT(DISP_LTPS_CTL_2_ADDR, 0x0001); |
| DISP_WRITE_OUT(DISP_LTPS_CTL_3_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_AMP_SETTING_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_1_ADDR, 0x0507); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_2_ADDR, 0x0405); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_3_ADDR, 0x0607); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_4_ADDR, 0x0502); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_5_ADDR, 0x0301); |
| DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_1_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_2_ADDR, 0x013F); |
| DISP_WRITE_OUT(DISP_POWER_CTL_3_ADDR, 0x0795); |
| |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0102); |
| WAIT_MSEC(1); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_4_ADDR, 0x0450); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0103); |
| WAIT_MSEC(1); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_5_ADDR, 0x0008); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0104); |
| WAIT_MSEC(1); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_6_ADDR, 0x0C00); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0105); |
| WAIT_MSEC(1); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_7_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0106); |
| WAIT_MSEC(1); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0801); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100); |
| WAIT_MSEC(1); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_2_ADDR, 0x001F); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0101); |
| WAIT_MSEC(60); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_2_ADDR, 0x009F); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0101); |
| WAIT_MSEC(10); |
| |
| DISP_WRITE_OUT(DISP_HORZ_RAM_ADDR_POS_1_ADDR, 0x0010); |
| DISP_WRITE_OUT(DISP_HORZ_RAM_ADDR_POS_2_ADDR, 0x00FF); |
| DISP_WRITE_OUT(DISP_VERT_RAM_ADDR_POS_1_ADDR, 0x0000); |
| DISP_WRITE_OUT(DISP_VERT_RAM_ADDR_POS_2_ADDR, 0x013F); |
| /* RAM starts at address 0x10 */ |
| DISP_WRITE_OUT(DISP_RAM_ADDR_SET_1_ADDR, 0x0010); |
| DISP_WRITE_OUT(DISP_RAM_ADDR_SET_2_ADDR, 0x0000); |
| |
| /* lcd controller uses internal clock, not ext. vsync */ |
| DISP_CMD_OUT(DISP_CMD_RAMWR); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0881); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100); |
| WAIT_MSEC(40); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0BE1); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100); |
| WAIT_MSEC(40); |
| |
| DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0BFF); |
| DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100); |
| } |
| display_on = TRUE; |
| } |
| |
| return 0; |
| } |
| |
| static void tmd20qvga_disp_set_contrast(void) |
| { |
| #if (defined(TMD20QVGA_LCD_18BPP)) |
| |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_1_ADDR, 0x0403); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_2_ADDR, 0x0302); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_3_ADDR, 0x0403); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_4_ADDR, 0x0303); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_5_ADDR, 0x0F07); |
| |
| #else |
| int newcontrast = 0x46; |
| |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_1_ADDR, 0x0403); |
| |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_2_ADDR, |
| DISP_VAL_IF(newcontrast & 0x0001, DISP_BITMASK_PKP20) | |
| DISP_VAL_IF(newcontrast & 0x0002, DISP_BITMASK_PKP21) | |
| DISP_VAL_IF(newcontrast & 0x0004, DISP_BITMASK_PKP22) | |
| DISP_VAL_IF(newcontrast & 0x0010, DISP_BITMASK_PKP30) | |
| DISP_VAL_IF(newcontrast & 0x0020, DISP_BITMASK_PKP31) | |
| DISP_VAL_IF(newcontrast & 0x0040, DISP_BITMASK_PKP32)); |
| |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_3_ADDR, |
| DISP_VAL_IF(newcontrast & 0x0010, DISP_BITMASK_PKP40) | |
| DISP_VAL_IF(newcontrast & 0x0020, DISP_BITMASK_PKP41) | |
| DISP_VAL_IF(newcontrast & 0x0040, DISP_BITMASK_PKP42) | |
| DISP_VAL_IF(newcontrast & 0x0001, DISP_BITMASK_PKP50) | |
| DISP_VAL_IF(newcontrast & 0x0002, DISP_BITMASK_PKP51) | |
| DISP_VAL_IF(newcontrast & 0x0004, DISP_BITMASK_PKP52)); |
| |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_4_ADDR, 0x0303); |
| DISP_WRITE_OUT(DISP_GAMMA_CONTROL_5_ADDR, 0x0F07); |
| |
| #endif /* defined(TMD20QVGA_LCD_18BPP) */ |
| |
| } /* End disp_set_contrast */ |
| |
| void tmd20qvga_disp_clear_screen_area |
| (word start_row, word end_row, word start_column, word end_column) { |
| int32 i; |
| |
| /* Clear the display screen */ |
| DISP_SET_RECT(start_row, end_row, start_column, end_column); |
| DISP_CMD_OUT(DISP_CMD_RAMWR); |
| i = (end_row - start_row + 1) * (end_column - start_column + 1); |
| for (; i > 0; i--) |
| DISP_DATA_OUT_16TO18BPP(0x0); |
| } |
| |
| static int __init tmd20qvga_probe(struct platform_device *pdev) |
| { |
| msm_fb_add_device(pdev); |
| |
| return 0; |
| } |
| |
| static struct platform_driver this_driver = { |
| .probe = tmd20qvga_probe, |
| .driver = { |
| .name = "ebi2_tmd_qvga", |
| }, |
| }; |
| |
| static struct msm_fb_panel_data tmd20qvga_panel_data = { |
| .on = tmd20qvga_disp_on, |
| .off = tmd20qvga_disp_off, |
| .set_rect = tmd20qvga_disp_set_rect, |
| }; |
| |
| static struct platform_device this_device = { |
| .name = "ebi2_tmd_qvga", |
| .id = 0, |
| .dev = { |
| .platform_data = &tmd20qvga_panel_data, |
| } |
| }; |
| |
| static int __init tmd20qvga_init(void) |
| { |
| int ret; |
| struct msm_panel_info *pinfo; |
| |
| ret = platform_driver_register(&this_driver); |
| if (!ret) { |
| pinfo = &tmd20qvga_panel_data.panel_info; |
| pinfo->xres = 240; |
| pinfo->yres = 320; |
| pinfo->type = EBI2_PANEL; |
| pinfo->pdest = DISPLAY_1; |
| pinfo->wait_cycle = 0x808000; |
| #ifdef TMD20QVGA_LCD_18BPP |
| pinfo->bpp = 18; |
| #else |
| pinfo->bpp = 16; |
| #endif |
| pinfo->fb_num = 2; |
| pinfo->lcd.vsync_enable = TRUE; |
| pinfo->lcd.refx100 = 6000; |
| pinfo->lcd.v_back_porch = 16; |
| pinfo->lcd.v_front_porch = 4; |
| pinfo->lcd.v_pulse_width = 0; |
| pinfo->lcd.hw_vsync_mode = FALSE; |
| pinfo->lcd.vsync_notifier_period = 0; |
| |
| ret = platform_device_register(&this_device); |
| if (ret) |
| platform_driver_unregister(&this_driver); |
| } |
| |
| return ret; |
| } |
| |
| module_init(tmd20qvga_init); |